NuGet için paketlerin yerini değiştirmek mümkün müdür?


283

Projelerimin çoğu için aşağıdaki konvansiyona sahibim:

/src
    /Solution.sln
    /SolutionFolder
        /Project1
        /Project2
        /etc..
/lib
    /Moq
        moq.dll
        license.txt
    /Yui-Compressor
        yui.compressor.dll
/tools
    /ILMerge
        ilmerge.exe

Ne fark edeceksiniz değil dış kütüphaneleri tutmak kaynak klasörüne. Ayrıca NuGet'i kullanmakla çok ilgileniyorum ancak bu harici kütüphaneleri kaynak klasör içinde istemiyorum. NuGet'in tüm paketlerin yüklendiği dizini değiştirme ayarı var mı?


10
Evet evet evet! Bu tam olarak kullandığım proje yapısı (ya da çok neredeyse) ve NuGet'in her zaman destekleyebileceğini merak ettim ...
Noldorin

Bunu şu cevapla nasıl yapacağım konusunda ayrıntılı bir şekilde konuştum: stackoverflow.com/a/19466173/564726 . Çözümün düzgün çalışması için solutionDir seçeneğini restore komutundan kaldırmanız gerekir.
BrutalDev

2
.Sln dosyasını en üst düzey klasörlerinizle aynı düzeye koydum. :)
Ian Warburton

Yanıtlar:


242

Artık paketlerin hangi klasöre yüklendiğini kontrol etmek mümkün.

http://nuget.codeplex.com/workitem/215

Düzenleme: Phil Haack'in 10 Aralık 2010, 23: 45'te (yukarıdaki iş öğesinde / bağlantıda) yorumuna bakın. Destek kısmen 1.0'da uygulanmaktadır, ancak belgelenmemiştir.

@Dfowler'e göre: Çözümün yanına bir nuget.config dosyası ekleyin:

<settings>
<repositoryPath>{some path here}</repositoryPath>
</settings>

Orada bir Nuget paket paket klasörü geçersiz kılma oluşturmak için.

2.1 sürümü güncellemesi

Azat'ın yorumladığı gibi, şimdi paket konumlarının nasıl kontrol edileceğine dair resmi belgeler var. 2.1 için sürüm notları bir nuget.config dosyasında belirtir aşağıdaki yapılandırmaya (bir yapılandırma dosyaları koymak geçerli yerlerin tanımı ve nasıl hiyerarşik yapılandırma modeli çalışmaları için sürüm notlarına bakın):

<configuration>
  <config>
    <add key="repositoryPath" value="C:\thePathToMyPackagesFolder" />
  </config>
  ... 
</configuration>

Bu, dosyayı yerleştirdiğiniz yapılandırma düzeyi için paketleri klasörünü değiştirir (çözüm dizinine koyarsanız çözüm, proje dizininde proje vb.). Sürüm notlarının şunları belirttiğine dikkat edin:

[...] çözüm kökünüzün altında mevcut bir paketler klasörünüz varsa, NuGet'in paketleri yeni konuma yerleştirmeden önce silmeniz gerekir.


5
Aslında yukarıdaki yapılandırma dosyası kullanılarak mümkündür. Vurgulanmamasının nedeni, bunu UI ve diğer yollarla mümkün kılma iş akışından geçmediğimiz için biraz tuhaflık bekliyoruz.
davidfowl

5
@Dfowler tarafından nuget.config'in nasıl çalıştığının tam açıklaması için reviewboard.nupack.com/r/131 adresine bakın . Örneğin, geçerli bir nuget.config şöyle görünür: <settings><repositoryPath>lib</repositoryPath> </settings>
Lee Harold

5
docs.nuget.org/docs/release-notes/nuget-2.1 Bkz. "Paketlerin" Klasör Konumunu Belirtme "paragrafı
Azat

1
2.1 + 'da bir şeyler yapmanın yeni yolunun çalışmadığını onaylayabilirim. Ve kodplex'te hatalar var: nuget.codeplex.com/workitem/2921 .
Dava

5
İkinci sürüm benim için çalışıyor, en son NuGet kullanıyorum ve şimdi iki çözüm aynı repoyu paylaşabilir. Bence bazı insanlar işe yaramayabilir çünkü mutlak yollar kullanabilirler mi? Görünüşe göre mutlak ve göreli yol önemlidir.
Csaba Toth

63
  1. "Nuget.config" adlı bir dosya oluşturuldu.
  2. Bu dosyayı çözümler klasörüne ekledim

Bu benim için işe yaramadı:

<configuration>
  <config>
    <add key="repositoryPath" value="..\ExtLibs\Packages" />
  </config>
  ... 
</configuration>

bu benim için çalıştı:

<?xml version="1.0" encoding="utf-8"?>
<settings>
  <repositoryPath>..\ExtLibs\Packages</repositoryPath>
</settings>

Burada aynı. Yapılandırma> config çalışmadı, ancak ayarlar> repositoryPath çalıştı.
Gene Reddick

Sadece ikinci çözüm çalışır: docs.nuget.org/docs/reference/nuget-config-file
cheesemacfly

15
Kullandığınız NuGet sürümüne bağlıdır.
Bronumski

1
Göreli yolların çözüme göreceli olduğunu ve projeleriniz farklı düzeylerde ise işe yaramayacağını unutmayın.
Nine Tails

2
Bu VIsual Studio 2013 için iyi çalışıyor, ancak Visual Studio 2015 kullanıyorsanız, yine de paketleri sln dosyasının yakınındaki paketleri klasörüne yükler,
fhnaseer

40

Bu gönderiyi okuyan başka biri uğruna - yukarıdaki yukarıdaki cevaplardan anladığım şey:

  1. .Nuget klasörde nuget.config dosyasıdır göreli o klasöre. Bu önemlidir çünkü yeni klasörünüz '../Packages' gibi bir şeyse, onu her zaman kutudan çıktığı yere koyacaktır. @ Bruce14'ün belirttiği gibi, bunun yerine '../../Packages' yapmalısınız

  2. Paket geri yüklemesini etkinleştirmeden standart konumun dışında bir paketler klasörü bulmak için en son nuget (2.8.5) alınamadı. Bu nedenle, paket geri yüklemesini etkinleştirdikten sonra, konumu değiştirmek için .nuget klasörünün içindeki nuget.config dosyasına aşağıdakiler eklenmelidir:

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
      ...
      <config>
        <add key="repositoryPath" value="..\..\Packages" />
      </config>
      ...
    </configuration>
  3. (Bu önemli) Eğer nuget.config dosyalarının paket klasör konumu içine HERHANGİ değişiklik yaparsanız gerekir görsel stüdyo yeniden başlatın veya yakın / değişikliklerin etkili olması için çözüm yeniden


5
Güven bana, # 3 noktan günümü kurtardı. Son 3 saatten # 3 noktanızı okuyana kadar delirdim. : '(Çok teşekkürler kardeşim!
merhaba

24

Visual Studio 2015'te Nuget 3.2 için bir çözüm:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <config>
        <add key="repositoryPath" value="../lib" />
    </config>
</configuration>

Üst klasör için eğik çizgi kullanma. Yukarıdaki dosyayı (nuget.config) çözüm klasörüne kaydedin.

Referans burada bulunabilir


Mükemmel! Visual Studio 2015 ve Nuget sürüm 3.2.0.10516 için çalışma
Anon Dev

Bir eğik çizgi demek istediniz gibi görünüyor ... ama çözüm pencerelerdeyse, belki bu eğik çizgi geriye doğru bir eğime dönüşebilir ya da belki eğik çizgi yazım hatasıydı ve bir ters eğime dönüşmelidir.
Gerard ONeill

2015'teyim ve bir klasör yukarı gitmek için .. \ .. \ Paketleri kullanmam gerekiyor.
Rhyous

1
../libBu eğik çizgi, ters eğik çizgi değil. Hangisini kastediyorsun?
jpmc26

Evet, kesinlikle eğik çizgi. Güncel cevap
phuongnd

15

2.1 için sürüm notlarında önerilen çözüm hazır değildir. Kod olduğunu belirtmeyi unuttular:

internal string ResolveInstallPath()
{
    if (!string.IsNullOrEmpty(this.OutputDirectory))
    {
        return this.OutputDirectory;
    }
    ISettings settings = this._configSettings;

    ...
}

bu da çalışmasını engeller. Bunu düzeltmek için NuGet.targets dosyanızı değiştirmeniz ve 'OutputDirectory' parametresini kaldırmanız gerekir:

    <RestoreCommand>$(NuGetCommand) install "$(PackagesConfig)" -source "$(PackageSources)"  $(RequireConsentSwitch)</RestoreCommand>

Şimdi, NuGet.config içinde bir yere 'repositoryPath' yapılandırması eklerseniz (yapılandırma dosyalarını koymak için geçerli yerlerin açıklaması için sürüm notlarına bakın), tüm paketleri tek bir konuma geri yükler, ancak ... .pronuz hala göreli yollar olarak yazılmış montajlara ilişkin ipuçları içeriyor ...

Hala PackagesDir göre ipucu yolları ekleyecekleri neden PackageManager'ı değiştirmek yerine zor yoldan gittiklerini anlamıyorum. Yerel olarak (masaüstümde) ve derleme aracısında farklı paket konumlarına sahip olmak için el ile bu şekilde davranıyorum.

<Reference Include="Autofac.Configuration, Version=2.6.3.862, Culture=neutral, PublicKeyToken=17863af14b0044da, processorArchitecture=MSIL">
  <Private>True</Private>
  <HintPath>$(PackagesDir)\Autofac.2.6.3.862\lib\NET40\Autofac.Configuration.dll</HintPath>
</Reference>

1
Kesinlikle haklısın. Şirketimde aslında kendimizi değiştirdiğimiz tam olarak açıkladığınız şeyi yapan bir NuGet sürümünü kullanıyoruz, yani proje dosyasının konumuna göre değil, Paketler Direktifi'ne HintPath'ler ekliyor. Bu mükemmel çalışıyor. Ne yazık ki, NuGet'te yaptığımız değişiklikleri resmi sürüme getirmeye çalışmak için hiç uğraşmadık, ama belki şimdi yapmanın zamanı geldi ...
afrischke

1
@afrischke: eğer yapabilirsen harika olur. Teşekkürler. Bunun ne zaman olabileceği hakkında bir fikrin var mı?
sgtz

11

Shane Kms yanıtına ek olarak, Nuget Paket Geri Yüklemeyi etkinleştirdiyseniz, .nuget klasöründe bulunan NuGet.config dosyasını aşağıdaki gibi düzenlersiniz:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <repositoryPath>..\..\ExtLibs\Packages</repositoryPath>
</configuration>

Çözüm klasöründen değil, .nuget klasöründen geri çekildiğinden fazladan ".. \" öğesine dikkat edin.


9

Bazı cevaplar eksik olduğu için bu cevapların hiçbiri benim için çalışmadı (Nuget 2.8.6), diğerleri için yararlı olabileceği için onları buraya eklemeye çalışacaktır.

Aşağıdaki kaynakları okuduktan sonra:
https://docs.nuget.org/consume/NuGet-Config-Settings
https://github.com/NuGet/Home/issues/1346
Görünüşe göre

  1. Kullanmak için gereken farklı repositoryPath ile düzgün takın-Package çalışma yapmak için ileri onlar ayrıştırma konuma Uri nesnesini kullanarak çünkü bu, eğik çizgi.
  2. Başlangıçta $ olmadan ayarlarımı hala görmezden geliyordu.
  3. NuGet yapılandırma dosyasını önbelleğe alır, bu nedenle değişikliklerden sonra çözümü / VS'yi yeniden yüklemeniz gerekir.
  4. Ayrıca bu seçeneği ayarlamak için NuGet.exe komutunu kullanırken garip bir sorun vardı, çünkü AppData \ Roaming \ NuGet altında benim küresel NuGet.exe değiştirildi ve orada paketleri geri yüklemeye başladı (Bu dosya daha yüksek önceliğe sahip, sadece tahmin).

Örneğin

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <solution>
    <add key="disableSourceControlIntegration" value="true" />
  </solution>
  <config>
    <add key="repositorypath" value="$/../../../Common/packages" />
  </config>
</configuration>

Sözdiziminin aşağıdaki gibi doğru olmasını sağlamak için NuGet komutunu da kullanabilirsiniz:

NuGet.exe config -Set repositoryPath=$/../../../Common/packages -ConfigFile NuGet.Config

8

.NET Core projeleri ve Visual Studio 2017 için, şu yapılandırmayı sağlayarak tüm paketleri göreli yola geri yükleyebildim:

<configuration>
  <config>
    <add key="globalPackagesFolder" value="lib" />
  </config>
  ... 
</configuration>

Deneyimlerime dayanarak, lib klasörü, sln dosyası nerede olursa olsun, Nuget.config dosyasının bulunduğu düzeyde oluşturuldu. Test ettim ve davranış komut satırı dotnet geri yükleme ve Visual Studio 2017 yeniden oluşturma için aynı


Bunu denedim. globalPackagesFolderAnahtarı projemin paket klasörüne ayarladım . İle tek bir paket eklemeye çalıştım dotnet add package MyPackage. nuget.exe83 .NET paketinin tüm çerçevesini bu klasöre indirdi. İstediğim bu değil. Tek MyPackage'ımı yerel, kaynak kontrollü paket klasörümde istedim.
Wallace Kelly

BÖYLE YAPMA! Bu, her yeni uygulama oluşturduğunuzda tüm çerçeve paketleri indirileceğinden HDD'nizi oldukça hızlı bir şekilde etkileyecektir.
Alaa Masoud

1
başka bir soruya verilen bu cevaba göre: stackoverflow.com/a/47407399/4572240 "respositoryPath Packages.config projeleri için kullanılır, globalPackagesFolder PackageReference projeleri için kullanılır".
Siderite Zackwehdex

7

Kabul edilen yanıttaki yapılandırma dosyası VS2012'de çalışır. Ancak, benim için sadece aşağıdakileri yaptığımda çalışır:

  1. VS'de yeni bir proje oluşturun.
  2. VS'den çıkın - bu önemli gibi görünüyor.
  3. Yapılandırma dosyalarını proje klasörüne kopyalayın.
  4. VS'yi yeniden başlatın ve paketler ekleyin.

Bu adımları uygularsam, paylaşılan bir paket klasörü kullanabilirim.


VS'yi yeniden başlatmak bunu işe almanın tek yoludur. Paket yöneticisi önbelleğe alır sanırım.
Filip

6

Packages.config yerine PackageReference kullanan projelerin yolunu değiştirmek için kullanmanız gerekir globalPackagesFolder

Gönderen https://docs.microsoft.com/en-us/nuget/reference/nuget-config-file

globalPackagesFolder (yalnızca PackageReference kullanan projeler)

Varsayılan genel paketler klasörünün konumu. Varsayılan,% userprofile% .nuget \ paketleri (Windows) veya ~ / .nuget / paketleri (Mac / Linux) şeklindedir. Göreli bir yol, projeye özgü nuget.config dosyalarında kullanılabilir. Bu ayar, öncelikli olan NUGET_PACKAGES ortam değişkeni tarafından geçersiz kılınır.

repositoryPath (yalnızca Packages.config)

Varsayılan $ (Solutiondir) / Packages klasörü yerine NuGet paketlerinin yükleneceği konum. Göreli bir yol, projeye özgü nuget.config dosyalarında kullanılabilir. Bu ayar, öncelikli olan NUGET_PACKAGES ortam değişkeni tarafından geçersiz kılınır.

<config>
    <add key="globalPackagesFolder" value="c:\packageReferences" />
    <add key="repositoryPath" value="c:\packagesConfig" />
</config>

Nuget.config dosyasını çözüm dosyamın yanına koydum ve işe yaradı.


5

Az önce keşfettiğim bir küçük şey daha. (Bu o kadar basit olabilir ki bazıları bundan bahsetmedi, ancak benim çözümüm için önemliydi.) "Packages" klasörü .sln dosyanızla aynı klasörde yer alıyor.

Biz .sln dosyamızı taşıdık ve sonra çeşitli projeleri ve voila'yı bulmak için içindeki tüm yolları düzelttik! Paketlerimiz klasörü istediğimiz yerde sona erdi.


4

VS 2017 için GÜNCELLEME:

Nuget ekibindeki insanlar nihayet Nuget'i kullanmaya başladılar ve bu da birkaç önemli şeyi bulmalarına ve düzeltmelerine yardımcı oldu. Yani şimdi (eğer yanılmıyorsam, hala VS 2017'ye geçmediyse) aşağıdakiler artık gerekli değil. Yerel bir klasöre "repositoryPath" ayarlayabilmeniz gerekir ve bu dosya çalışır. Hatta varsayılan olarak çözüm klasörlerinin makine düzeyine taşındığı konumu geri yükleyebilirsiniz. Yine - hala kendi başıma test etmedim

VS 2015 ve öncesi

Diğer cevaplara bir ipucu (özellikle bu ):

NuGet Paketi klasörünün konumu yapılandırma yoluyla değiştirilebilir, ancak VisualStudio yine de bu klasördeki derlemelere nispeten başvurur:

<HintPath>..\..\..\..\..\..\SomeAssembly\lib\net45\SomeAssembly.dll</HintPath>

Bu sorunu çözmek için (daha iyi bir çözüm olana kadar) Packages komutunun yeni bir konumunu gösteren bir sanal sürücü oluşturmak için subst komutunu kullandım :

subst N: C:\Development\NuGet\Packages

Şimdi yeni bir NuGet paketi eklerken, proje referansı mutlak konumunu kullanıyor:

<HintPath>N:\SomeAssembly\lib\net45\SomeAssembly.dll</HintPath>

Not:

  1. Böyle bir sanal sürücü yeniden başlatıldıktan sonra silinecek, bu nedenle emin olmak idare
  2. Proje dosyalarındaki mevcut referansları değiştirmeyi unutmayın.

Bugün hala böyle mi? Yani yeni eklenen paketler için absoulute lokasyonunu kullanamıyoruz? Bu sanal sürücü çözümü bana hantal görünüyor
batmaci

Evet, hala hiçbir şey değişmemiş bir dava
Kamarey

2
Aslında göreceli bir yolu tercih ederim - farklı geliştiriciler kod için farklı kök konumlarına sahipse, kaynak denetiminde çakışma olmaz.
jbyrd

Acaba neden <HintPath>$(SolutionDir)\packages\SomeAssembly\lib\net45\SomeAssembly.dll</HintPath> kullanmak yerine yapamıyorsunsubst
Vinod Srivastav

Tüm paketlerin çözüm başına değil, tek bir yerde olmasını istedim
Kamarey

3

Sadece Nuget 2.8.3 ile güncelleme. Kurulu paketlerin konumunu değiştirmek için, sağ tıklama çözümünden paket geri yüklemeyi etkinleştirdim. NuGet.Config düzenledi ve şu satırları ekledi:

  <config>
    <add key="repositorypath" value="..\Core\Packages" />
  </config>

Ardından çözümü yeniden oluşturdu, tüm paketleri istediğim klasöre indirdi ve referansları otomatik olarak güncelledi.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.