Apakah mungkin untuk mengubah lokasi paket untuk NuGet?

283

Saya memiliki konvensi berikut untuk sebagian besar proyek saya:

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

Anda akan melihat bahwa saya tidak menyimpan perpustakaan eksternal di dalam folder sumber. Saya juga sangat tertarik menggunakan NuGet tetapi tidak ingin perpustakaan eksternal ini berada di dalam folder source. Apakah NuGet memiliki pengaturan untuk mengubah direktori yang memuat semua paket?

TheCloudlessSky
sumber
10
Ya ya ya! Ini persis struktur proyek yang saya gunakan (atau sangat hampir), dan saya selalu bertanya-tanya dengan NuGet dapat mendukungnya ...
Noldorin
Saya telah membahas secara terperinci tentang bagaimana melakukan ini dengan jawaban berikut ini: stackoverflow.com/a/19466173/564726 . Anda sering perlu menghapus opsi solutionDir dari perintah restore agar bisa berfungsi dengan benar.
BrutalDev
2
Saya meletakkan .sln di tingkat yang sama dengan folder tingkat atas Anda. :)
Ian Warburton

Jawaban:

242

Sekarang mungkin untuk mengontrol folder tempat paket-paket tersebut diinstal.

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

Sunting: Lihat komentar Phil Haack pada 10 Desember 2010 pukul 11:45 malam (dalam item pekerjaan / tautan di atas). Dukungan ini sebagian diimplementasikan pada 1.0, tetapi tidak didokumentasikan.

Menurut @dfowler: Tambahkan file nuget.config di sebelah solusi dengan ini:

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

Ada paket nuget untuk membuat folder override paket.

Pembaruan untuk versi 2.1

Seperti yang dikomentari Azat, sekarang ada dokumentasi resmi tentang cara mengontrol lokasi paket. The rilis catatan untuk 2.1 menspesifikasikan konfigurasi berikut dalam file nuget.config (lihat catatan rilis untuk deskripsi tempat valid untuk menempatkan file konfigurasi dan bagaimana hirarkis Model konfigurasi karya):

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

Ini akan mengubah folder paket untuk tingkat konfigurasi Anda memasukkan file (solusi jika Anda meletakkannya di direktori solusi, proyek di direktori proyek dan sebagainya). Perhatikan bahwa catatan rilis menyatakan:

[...] jika Anda memiliki folder paket yang ada di bawah root solusi Anda, Anda harus menghapusnya sebelum NuGet akan menempatkan paket di lokasi baru.

PHeiberg
sumber
5
Sebenarnya dimungkinkan menggunakan file konfigurasi di atas. Alasan itu tidak ditekankan adalah karena kami belum melalui alur kerja memungkinkan ini melalui UI dan cara lain sehingga mengharapkan beberapa quirkiness.
davidfowl
5
Lihat reviewboard.nupack.com/r/131 untuk keterangan lengkap oleh @dfowler tentang cara kerja nuget.config. Misalnya, nuget.config yang valid akan terlihat seperti ini: <settings><repositoryPath>lib</repositoryPath> </settings>
Lee Harold
5
docs.nuget.org/docs/release-notes/nuget-2.1 Lihat paragraf "Tetapkan Lokasi Folder 'paket' paket"
Azat
1
Saya dapat mengkonfirmasi cara baru dalam melakukan sesuatu di 2.1+ tidak berfungsi. Dan ada bug tentang hal itu di codeplex: nuget.codeplex.com/workitem/2921 .
Kasus
5
Versi kedua berfungsi untuk saya, saya menggunakan NuGet terbaru, dan sekarang dua solusi dapat berbagi repo yang sama. Saya pikir itu mungkin tidak berhasil beberapa orang karena mereka mungkin menggunakan jalur absolut? Tampaknya jalur absolut vs relatif penting.
Csaba Toth
63
  1. Membuat file yang disebut "nuget.config".
  2. Menambahkan file itu ke folder solusi saya

ini TIDAK bekerja untuk saya:

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

ini berhasil bagi saya:

<?xml version="1.0" encoding="utf-8"?>
<settings>
  <repositoryPath>..\ExtLibs\Packages</repositoryPath>
</settings>
ShaneKm
sumber
Sama disini. Konfigurasi> config tidak berfungsi, tetapi pengaturan> repositoryPath berhasil.
Gene Reddick
Hanya solusi kedua yang berfungsi: docs.nuget.org/docs/reference/nuget-config-file
cheesemacfly
15
Itu tergantung pada versi NuGet yang Anda gunakan.
Bronumski
1
Perhatikan bahwa jalur relatif relatif terhadap solusi sehingga jika proyek Anda berada pada tingkat yang berbeda maka itu tidak akan berhasil.
Sembilan Ekor
2
Ini berfungsi dengan baik untuk VIsual Studio 2013, tetapi jika saya menggunakan Visual Studio 2015 maka masih menginstal paket dalam folder paket di dekat file sln,
fhnaseer
40

Oke demi orang lain yang membaca posting ini - inilah yang saya mengerti dari segudang jawaban di atas:

  1. File nuget.config dalam folder .nuget relatif terhadap folder itu. Ini penting karena jika folder baru Anda seperti '../Paket' yang akan meletakkannya di tempat yang selalu keluar dari kotak. Sebagai @ bruce14 menyatakan Anda harus melakukan '../../Paket' sebagai gantinya

  2. Saya tidak bisa mendapatkan nuget terbaru (2.8.5) untuk menemukan folder paket di luar lokasi standar tanpa mengaktifkan paket restore. Jadi begitu Anda mengaktifkan paket restore maka yang berikut harus ditambahkan ke file nuget.config di dalam folder .nuget untuk mengubah lokasi:

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
      ...
      <config>
        <add key="repositoryPath" value="..\..\Packages" />
      </config>
      ...
    </configuration>
  3. (Ini penting) Jika Anda melakukan perubahan pada lokasi folder paket di dalam file nuget.config, Anda harus memulai kembali visual studio atau menutup / memuat ulang solusi agar perubahan diterapkan.

Robert Petz
sumber
5
Percayalah, poin # 3 Anda menyelamatkan hari saya. Saya sudah gila sejak 3 jam terakhir sampai saya membaca poin # 3 Anda. : '(Terima kasih banyak
kawan
24

Solusi untuk Nuget 3.2 pada Visual Studio 2015 adalah:

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

Menggunakan forward slash untuk folder induk. Simpan file di atas (nuget.config) di folder solusi.

Referensi tersedia di sini

phuongnd
sumber
Sempurna! Bekerja untuk Visual Studio 2015 dan Nuget versi 3.2.0.10516
Anon Dev
Anda tampaknya telah berarti garis miring ke depan .. tetapi jika solusinya ada di windows, mungkin garis miring ke belakang, atau mungkin garis miring adalah kesalahan ketik dan harus berubah menjadi garis miring ke belakang.
Gerard ONeill
Saya pada tahun 2015 dan saya perlu menggunakan .. \ .. \ Paket untuk membuatnya naik satu folder.
Rhyous
1
../libItu adalah garis miring ke depan, bukan garis miring ke belakang. Yang kamu maksud
jpmc26
Ya, itu persis garis miring. Jawaban yang diperbarui
phuongnd
15

Solusi yang diusulkan dalam catatan rilis untuk 2.1 tidak bekerja di luar kotak. Mereka lupa menyebutkan bahwa ada kode:

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

    ...
}

yang mencegahnya bekerja. Untuk memperbaikinya, Anda perlu memodifikasi file NuGet.targets Anda dan menghapus parameter 'OutputDirectory':

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

Jadi sekarang, jika Anda menambahkan config 'repositoryPath' di suatu tempat di NuGet.config (lihat catatan rilis untuk deskripsi tempat yang valid untuk meletakkan file config), itu akan mengembalikan semua paket ke satu lokasi, tetapi ... .csproj Anda masih berisi petunjuk untuk majelis yang ditulis sebagai jalur relatif ...

Saya masih tidak mengerti mengapa mereka melakukan hal yang sulit alih-alih mengubah PackageManager sehingga itu akan menambah jalur petunjuk relatif ke PackagesDir. Itulah yang saya lakukan secara manual untuk memiliki lokasi paket yang berbeda secara lokal (di desktop saya) dan pada agen pembangunan.

<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>
Dmitry Naumov
sumber
1
Anda memang benar. Di perusahaan saya, kami benar-benar menggunakan versi NuGet yang kami modifikasi sendiri yang melakukan persis seperti yang Anda gambarkan, yaitu menambahkan HintPaths relatif terhadap Paket Dir tidak relatif terhadap lokasi file proyek. Ini bekerja dengan sangat baik. Sayangnya kami tidak pernah sempat mencoba untuk membawa perubahan yang kami buat untuk NuGet ke versi resmi, tapi mungkin sekarang saatnya untuk melakukan itu sekarang ...
afrischke
1
@afrischke: itu akan bagus jika Anda bisa melakukan itu. Terima kasih. Tahu kapan ini mungkin terjadi?
sgtz
11

Selain jawaban Shane Kms, jika Anda telah mengaktifkan Pemulihan Paket Nuget, Anda mengedit NuGet.config yang terletak di folder .nuget sebagai berikut:

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

Perhatikan tambahan ".. \", karena backtracks dari folder .nuget dan bukan folder solusi.

pengguna
sumber
9

Tidak satu pun dari jawaban ini yang bekerja untuk saya (Nuget 2.8.6) karena kehilangan beberapa tips, akan mencoba menambahkannya di sini karena mungkin berguna bagi orang lain.

Setelah membaca sumber-sumber berikut:
https://docs.nuget.org/consume/NuGet-Config-Settings
https://github.com/NuGet/Home/issues/1346
Tampaknya

  1. Untuk membuat bekerja Install-Paket benar dengan repositoryPath yang berbeda Anda perlu menggunakan maju garis miring, itu karena mereka menggunakan Uri objek ke lokasi parse.
  2. Tanpa $ pada awalnya itu masih mengabaikan pengaturan saya.
  3. NuGet menyimpan file konfigurasi, jadi setelah modifikasi, Anda perlu memuat ulang solusi / VS.
  4. Saya juga memiliki masalah aneh ketika menggunakan perintah NuGet.exe untuk mengatur opsi ini, karena ia memodifikasi NuGet.exe global saya di bawah AppData \ Roaming \ NuGet dan mulai memulihkan paket di sana (Karena file tersebut memiliki prioritas lebih tinggi, hanya menebak-nebak).

Misalnya

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

Anda juga dapat menggunakan perintah NuGet untuk memastikan bahwa sintaks akan benar seperti ini:

NuGet.exe config -Set repositoryPath=$/../../../Common/packages -ConfigFile NuGet.Config
Roman Badiornyi
sumber
8

Untuk proyek .NET Core dan Visual Studio 2017 saya dapat mengembalikan semua paket ke jalur relatif dengan menyediakan konfigurasi ini:

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

Berdasarkan pengalaman saya folder lib dibuat pada tingkat yang sama di mana Nuget.config ditemukan, di mana pun file sln berada. Saya menguji dan perilaku yang sama untuk mengembalikan dotnet baris perintah, dan Visual Studio 2017 membangun kembali

Kirill Chilingarashvili
sumber
Saya mencoba ini. Saya mengatur globalPackagesFolderkunci ke folder paket proyek saya. Saya mencoba menambahkan satu paket dengan dotnet add package MyPackage. nuget.exemengunduh seluruh kerangka 83 paket .NET ke folder itu. Bukan itu yang saya maksudkan. Saya hanya ingin MyPackage tunggal saya di folder paket lokal saya yang dikendalikan sumber.
Wallace Kelly
JANGAN LAKUKAN ITU! Ini akan membanjiri HDD Anda dengan cukup cepat karena seluruh paket kerangka kerja akan diunduh setiap kali Anda membuat aplikasi baru.
Alaa Masoud
1
sesuai jawaban ini untuk pertanyaan lain: stackoverflow.com/a/47407399/4572240 "respositoryPath digunakan untuk proyek packages.config, globalPackagesFolder digunakan untuk proyek PackageReference".
Siderite Zackwehdex
7

File konfigurasi dalam jawaban yang diterima berfungsi untuk saya di VS2012. Namun, bagi saya itu hanya berfungsi ketika saya melakukan hal berikut:

  1. Buat proyek baru di VS.
  2. Keluar VS - ini tampaknya penting.
  3. Salin file konfigurasi ke folder proyek.
  4. Mulai ulang VS dan tambahkan paket.

Jika saya mengikuti langkah-langkah itu saya bisa menggunakan folder paket bersama.

Harald
sumber
Restart VS adalah satu-satunya cara saya mendapatkan ini berfungsi. Tebak manajer paket menyimpannya.
Filipi
6

Untuk mengubah jalur untuk proyek menggunakan PackageReference alih-alih paket.config yang perlu Anda gunakan globalPackagesFolder

Dari https://docs.microsoft.com/en-us/nuget/reference/nuget-config-file

globalPackagesFolder (proyek menggunakan PackageReference saja)

Lokasi folder paket global default. Standarnya adalah% userprofile% .nuget \ package (Windows) atau ~ / .nuget / packages (Mac / Linux). Jalur relatif dapat digunakan dalam file nuget.config khusus proyek. Pengaturan ini ditimpa oleh variabel lingkungan NUGET_PACKAGES, yang diutamakan.

repositoryPath (hanya paket.config)

Lokasi tempat menginstal paket NuGet dan bukannya folder $ default (Solutiondir) / paket. Jalur relatif dapat digunakan dalam file nuget.config khusus proyek. Pengaturan ini ditimpa oleh variabel lingkungan NUGET_PACKAGES, yang diutamakan.

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

Saya meletakkan Nuget.config di sebelah file solusi saya dan berhasil.

Manny
sumber
5

Satu lagi berita gembira kecil yang baru saja saya temukan. (Ini mungkin sangat mendasar sehingga beberapa belum menyebutkannya, tetapi ini penting untuk solusi saya.) Folder "paket" berakhir di folder yang sama dengan file .sln Anda.

Kami memindahkan file .sln kami dan kemudian memperbaiki semua jalur di dalamnya untuk menemukan berbagai proyek dan voila! Folder paket kami berakhir di tempat yang kami inginkan.

NickNuke
sumber
4

UPDATE untuk VS 2017:

Terlihat orang-orang di tim Nuget akhirnya mulai menggunakan Nuget sendiri yang membantu mereka menemukan dan memperbaiki beberapa hal penting. Jadi sekarang (jika saya tidak salah, karena masih tidak bermigrasi ke VS 2017) di bawah ini tidak diperlukan lagi. Anda harus dapat mengatur "repositoryPath" ke folder lokal dan itu akan berfungsi. Bahkan Anda dapat membiarkannya sama sekali karena secara default mengembalikan lokasi dipindahkan dari folder solusi ke level mesin. Lagi - saya masih belum mengujinya sendiri

VS 2015 dan sebelumnya

Hanya tip untuk jawaban lain (khusus ini ):

Lokasi folder Paket NuGet dapat diubah melalui konfigurasi, tetapi VisualStudio masih merujuk rakitan di folder ini secara relatif:

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

Untuk mengatasinya (hingga solusi yang lebih baik) saya menggunakan perintah subst untuk membuat drive virtual yang menunjuk ke lokasi baru folder Paket:

subst N: C:\Development\NuGet\Packages

Sekarang ketika menambahkan paket NuGet baru, referensi proyek menggunakan lokasi absolutnya:

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

catatan:

  1. Drive virtual tersebut akan dihapus setelah dimulai ulang, jadi pastikan Anda menanganinya
  2. Jangan lupa mengganti referensi yang ada dalam file proyek.
Kamarey
sumber
Apakah masih demikian hari ini? Maksud saya, kami tidak dapat menggunakan lokasi absoulute untuk paket baru yang ditambahkan? solusi drive virtual ini terlihat rumit bagi saya
batmaci
Yap, masih merupakan kasus karena tidak ada yang berubah
Kamarey
2
Saya sebenarnya lebih suka jalur relatif - dengan cara itu tidak ada konflik dalam kontrol sumber jika pengembang yang berbeda memiliki lokasi root yang berbeda untuk kode tersebut.
jbyrd
Saya ingin tahu mengapa Anda tidak dapat melakukannya <HintPath>$(SolutionDir)\packages\SomeAssembly\lib\net45\SomeAssembly.dll</HintPath> daripada menggunakansubst
Vinod Srivastav
Saya ingin semua paket berada di satu tempat, bukan per solusi
Kamarey
3

Baru saja memperbarui dengan Nuget 2.8.3. Untuk mengubah lokasi paket yang diinstal, saya mengaktifkan pemulihan paket dari solusi mengklik kanan. Diedit NuGet.Config dan menambahkan baris ini:

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

Kemudian membangun kembali solusi, itu mengunduh semua paket ke folder yang saya inginkan dan memperbarui referensi secara otomatis.

amarnath chatterjee
sumber