Saya memiliki situasi serupa dengan sumber paket eksternal dan internal dengan proyek yang dirujuk di lebih dari satu solusi. Saya baru saja membuatnya berfungsi dengan salah satu basis kode kami hari ini dan tampaknya berfungsi dengan workstation pengembang dan server build kami. Proses di bawah ini memiliki skenario ini dalam pikiran (meskipun seharusnya tidak sulit untuk beradaptasi untuk memiliki folder paket umum di tempat lain).
- Basis kode
- Proyek A
- Proyek B
- Proyek C
- Solusi
- Solusi 1
- Solusi 2
- Solusi 3
- Paket (ini adalah paket umum yang dibagikan oleh semua solusi)
Jawaban yang diperbarui pada NuGet 3.5.0.1484 dengan Visual Studio 2015 Pembaruan 3
Proses ini sekarang sedikit lebih mudah daripada ketika saya awalnya menangani ini dan berpikir sudah waktunya untuk memperbarui ini. Secara umum, prosesnya sama hanya dengan beberapa langkah. Hasilnya adalah proses yang memecahkan atau menyediakan hal-hal berikut:
- Segala sesuatu yang perlu dilakukan untuk kontrol kode sumber terlihat dan dilacak dalam solusi
- Menginstal paket baru atau memperbarui paket menggunakan Package Manager di Visual Studio akan menggunakan jalur repositori yang benar
- Setelah konfigurasi awal, tidak ada peretasan file .csproj
- Tidak ada modifikasi workstation pengembang (Kode siap dibangun saat check out)
Ada beberapa potensi kerugian yang harus diperhatikan (saya belum mengalaminya, YMMV). Lihat jawaban dan komentar Benol di bawah ini.
Tambahkan NuGet.Config
Anda akan ingin membuat file NuGet.Config di root folder \ Solutions \. Pastikan ini adalah file berenkode UTF-8 yang Anda buat, jika Anda tidak yakin bagaimana melakukannya, gunakan menu File-> New-> File di Visual Studio dan kemudian pilih template File XML. Tambahkan ke NuGet.Config berikut ini:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<config>
<add key="repositoryPath" value="$\..\Packages" />
</config>
</configuration>
Untuk setelan repositoryPath, Anda bisa menentukan jalur absolut atau jalur relatif (disarankan) menggunakan $ token. Token $ didasarkan pada di mana NuGet.Config berada (Token $ sebenarnya relatif terhadap satu tingkat di bawah lokasi NuGet.Config). Jadi, jika saya memiliki \ Solutions \ NuGet.Config dan saya ingin \ Solutions \ Packages, saya perlu menentukan $ \ .. \ Packages sebagai nilainya.
Selanjutnya, Anda akan ingin menambahkan Folder Solusi ke solusi Anda yang disebut sesuatu seperti "NuGet" (Klik kanan pada solusi Anda, Tambah-> Folder Solusi Baru). Folder Solusi adalah folder virtual yang hanya ada di solusi Visual Studio dan tidak akan membuat folder sebenarnya di drive (dan Anda dapat mereferensikan file dari mana saja). Klik kanan pada folder solusi "NuGet" Anda dan kemudian Add-> Existing Item dan pilih \ Solutions \ NuGet.Config.
Alasan kami melakukan ini adalah agar terlihat dalam solusi dan akan membantu memastikannya berkomitmen dengan benar ke kontrol kode sumber Anda. Anda mungkin ingin melakukan langkah ini untuk setiap solusi dalam basis kode Anda yang berpartisipasi dengan proyek bersama Anda.
Dengan menempatkan file NuGet.Config di \ Solutions \ di atas file .sln mana pun, kami memanfaatkan fakta bahwa NuGet akan secara rekursif menavigasi ke atas struktur folder dari "direktori kerja saat ini" mencari file NuGet.Config untuk digunakan. "Direktori kerja saat ini" berarti beberapa hal yang berbeda di sini, yang pertama adalah jalur eksekusi NuGet.exe dan yang lainnya adalah lokasi file .sln.
Mengalihkan folder paket Anda
Pertama, saya sangat menyarankan Anda melalui setiap folder solusi Anda dan menghapus folder \ Paket \ yang ada (Anda harus menutup Visual Studio terlebih dahulu). Ini membuatnya lebih mudah untuk melihat di mana NuGet menempatkan folder \ Paket \ yang baru Anda konfigurasi dan memastikan bahwa setiap tautan ke folder \ Paket \ yang salah akan gagal dan kemudian dapat diperbaiki.
Buka solusi Anda di Visual Studio dan mulai Rebuild All. Abaikan semua kesalahan build yang akan Anda terima, ini diharapkan pada saat ini. Ini harus memulai fitur pemulihan paket NuGet pada awal proses pembuatan. Verifikasi bahwa folder \ Solutions \ Packages \ Anda telah dibuat di tempat yang Anda inginkan. Jika belum, tinjau konfigurasi Anda.
Sekarang, untuk setiap proyek dalam solusi Anda, Anda ingin:
- Klik kanan pada proyek dan pilih Unload Project
- Klik kanan pada proyek dan pilih Edit-xxx.csproj Anda
- Temukan referensi apa pun ke \ paket \ dan perbarui ke lokasi baru.
- Sebagian besar akan menjadi referensi <HintPath>, tetapi tidak semuanya. Misalnya, WebGrease dan Microsoft.Bcl.Build akan memiliki pengaturan jalur terpisah yang perlu diperbarui.
- Simpan .csproj lalu klik kanan pada proyek dan pilih Reload Project
Setelah semua file .csproj Anda diperbarui, mulai Rebuild All lagi dan Anda seharusnya tidak lagi menemukan error build tentang referensi yang hilang. Pada titik ini Anda sudah selesai, dan sekarang NuGet telah dikonfigurasi untuk menggunakan folder Paket bersama.
Mulai NuGet 2.7.1 (2.7.40906.75) dengan VStudio 2012
Hal pertama yang perlu diingat adalah bahwa nuget.config tidak mengontrol semua pengaturan jalur dalam sistem paket nuget. Ini sangat membingungkan untuk dipikirkan. Secara khusus, masalahnya adalah bahwa msbuild dan Visual Studio (memanggil msbuild) tidak menggunakan jalur di nuget.config melainkan menimpanya di file nuget.t target.
Persiapan Lingkungan
Pertama, saya akan melalui folder solusi Anda dan menghapus semua \ paket \ folder yang ada. Ini akan membantu memastikan bahwa semua paket secara jelas dipasang ke folder yang benar dan membantu menemukan referensi jalur yang buruk di seluruh solusi Anda. Selanjutnya, saya akan memastikan Anda memiliki ekstensi Visual Studio nuget terbaru yang diinstal. Saya juga akan memastikan Anda memiliki nuget.exe terbaru yang diinstal ke setiap solusi. Buka prompt perintah dan masuk ke setiap folder $ (SolutionDir) \ .nuget \ dan jalankan perintah berikut:
nuget update -self
Mengatur jalur folder paket umum untuk NuGet
Buka setiap $ (SolutionDir) \ .nuget \ NuGet.Config dan tambahkan yang berikut ini ke dalam bagian <configuration>:
<config>
<add key="repositorypath" value="$\..\..\..\Packages" />
</config>
Catatan: Anda dapat menggunakan jalur absolut atau jalur relatif. Perlu diingat, jika Anda menggunakan path relatif dengan $ yang relatif satu tingkat di bawah lokasi NuGet.Config (yakin ini adalah bug).
Menetapkan jalur folder paket umum untuk MSBuild dan Visual Studio
Buka setiap $ (SolutionDir) \ .nuget \ NuGet.t target dan ubah bagian berikut (perhatikan bahwa untuk non-Windows ada bagian lain di bawahnya):
<PropertyGroup Condition=" '$(OS)' == 'Windows_NT'">
<!-- Windows specific commands -->
<NuGetToolsPath>$([System.IO.Path]::Combine($(SolutionDir), ".nuget"))</NuGetToolsPath>
<PackagesConfig>$([System.IO.Path]::Combine($(ProjectDir), "packages.config"))</PackagesConfig>
<PackagesDir>$([System.IO.Path]::Combine($(SolutionDir), "packages"))</PackagesDir>
</PropertyGroup>
Perbarui PackageDir menjadi
<PackagesDir>$([System.IO.Path]::GetFullPath("$(SolutionDir)\..\Packages"))</PackagesDir>
Catatan: GetFullPath akan menyelesaikan jalur relatif kita menjadi jalur absolut.
Mengembalikan semua paket nuget ke folder umum
Buka prompt perintah dan buka setiap $ (SolutionDir) \ .nuget dan jalankan perintah berikut:
nuget restore ..\YourSolution.sln
Pada titik ini, Anda harus memiliki satu folder \ paket \ di lokasi umum Anda dan tidak ada dalam folder solusi mana pun. Jika tidak, maka verifikasi jalur Anda.
Memperbaiki referensi proyek
Buka setiap file .csproj di editor teks dan temukan referensi apa pun ke \ paket dan perbarui ke jalur yang benar. Sebagian besar akan menjadi referensi <HintPath>, tetapi tidak semuanya. Misalnya, WebGrease dan Microsoft.Bcl.Build akan memiliki pengaturan jalur terpisah yang perlu diperbarui.
Bangun solusi Anda
Buka solusi Anda di Visual Studio dan mulai build. Jika mengeluh tentang paket yang hilang yang perlu dipulihkan, jangan berasumsi bahwa paket tersebut hilang dan perlu dipulihkan (kesalahan bisa menyesatkan). Ini bisa menjadi jalur yang buruk di salah satu file .csproj Anda. Periksa dulu sebelum mengembalikan paket.
Punya kesalahan versi tentang paket yang hilang?
Jika Anda telah memverifikasi bahwa jalur di file .csproj Anda sudah benar, maka Anda memiliki dua opsi untuk dicoba. Jika ini adalah hasil dari memperbarui kode Anda dari kontrol kode sumber, maka Anda dapat mencoba memeriksa salinan bersih dan kemudian membangunnya. Ini berfungsi untuk salah satu pengembang kami dan saya pikir ada artefak di file .suo atau yang serupa. Opsi lainnya adalah memaksa pemulihan paket secara manual menggunakan baris perintah di folder .nuget dari solusi yang dimaksud:
nuget restore ..\YourSolution.sln
$
di depan jalur relatif. Juga, jawaban atas pertanyaan Anda tentang file NuGet.Config ada di sini . Ini terlihat pertama di .nuget, maka dalam semua direktori induk, maka pada file 'global' di AppData Anda: maka berlaku mereka dalam rangka MUNDUR (apapun yang berarti).