Saya telah menggunakan NuGet untuk mengambil paket dari sumber paket eksternal dan internal, yang sangat nyaman. Tetapi saya telah menyadari bahwa paket secara default disimpan per solusi, yang sangat membuat frustrasi ketika beberapa proyek dengan referensi NuGet disertakan dalam beberapa solusi. Kemudian referensi diubah ke folder paket solusi lain yang mungkin sebenarnya tidak tersedia untuk pengembang atau mesin build lain.
Saya telah melihat bahwa ada cara untuk menunjukkan lokasi paket umum (mungkin di tingkat akar proyek, kami menggunakan kontrol sumber TFS) dengan rilis 2.1 dari NuGet, lihat catatan rilis . Saya menggunakan NuGet v2.7
Tetapi saya telah mencoba menambahkan file nuget.config tanpa melihat efek apa pun dari ini. Paket masih disimpan di folder solusi. Apakah ada yang saya lewatkan? Tampaknya ada struktur berbeda dari node xml untuk ditambahkan ke file nuget.config, tergantung pada siapa yang menjawab pertanyaan itu: Schwarzie menyarankan pada utas Stackoverflow lain :
<settings>
<repositoryPath>..\..\[relative or absolute path]</repositoryPath>
</settings>
Catatan rilis untuk NuGet 2.1 (lihat tautan di atas) menyarankan format ini:
<configuration>
<config>
<add key="repositoryPath" value="..\..\[relative or absolute path]" />
</config>
</configuration>
Saya tidak tahu yang mana, atau salah satu, atau keduanya yang pada akhirnya akan berhasil. Saya telah mencoba keduanya di tingkat solusi. Dapatkah file nuget.config ditempatkan di tingkat akar proyek TFS, atau haruskah itu ada di direktori solusi? Tampaknya NuGet membaca dan menerapkan pengaturan dari file-file ini dalam urutan tertentu, mengapa masuk akal untuk menambahkannya di beberapa level, di mana file nuget.config pada level solusi akan menimpa file di level root proyek TFS. Bisakah ini diperjelas?
Apakah saya perlu menghapus semua paket yang diinstal sebelum referensi tersebut berfungsi? Saya akan senang jika seseorang dapat memberikan instruksi langkah demi langkah untuk berpindah dari penggunaan nuget khusus solusi ke folder paket umum di mana proyek yang termasuk dalam beberapa solusi dapat menemukan paket nuget yang mereka butuhkan.
sumber
$
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).Jawaban:
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).
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:
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:
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:
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:
Mengatur jalur folder paket umum untuk NuGet
Buka setiap $ (SolutionDir) \ .nuget \ NuGet.Config dan tambahkan yang berikut ini ke dalam bagian <configuration>:
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):
Perbarui PackageDir menjadi
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:
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:
sumber
Alih-alih menetapkan lokasi paket umum untuk semua proyek, dimungkinkan juga untuk mengubah HintPath dalam proyek sebagai berikut:
Dalam kebanyakan kasus, dalam proyek bersama hanya akan ada beberapa paket, sehingga Anda dapat dengan mudah mengubahnya.
Saya pikir ini adalah solusi yang lebih baik, ketika Anda bercabang kode, saat mengatur repo umum, Anda harus mengubah jalur relatif, dalam solusi ini Anda tidak perlu melakukan ini.
sumber
Pengalaman saya mencoba ini dengan versi terbaru NuGet (2.7) dan VS2012:
Dalam kasus saya, saya ingin memasukkan semua paket
.packages
, jadi NuGet.Config saya terlihat seperti di bawah ini.Perhatikan bahwa ada beberapa hal 'aneh' yang dapat terjadi, tetapi menurut saya hal itu dapat diterima:
Penafian : Saya baru mencobanya hari ini, saya tidak memiliki pengalaman jangka panjang untuk mendukungnya!
sumber
Saya memiliki NuGet versi 2.8.50926 dengan VS 2013. Anda tidak perlu menggunakan beberapa file nuget.config, atau menggunakan struktur direktori yang kompleks. Ubah saja file default yang ada di sini:
Ini konten file saya:
Jadi semua paket masuk ke folder "C: \ Projects \ nugetpackages", di mana pun solusinya.
Dalam semua solusi Anda, hapus saja folder "paket" yang ada. Kemudian buat solusi Anda, dan NuGet akan secara otomatis mengembalikan paket yang hilang di direktori baru yang terpusat yang Anda tentukan.
sumber
Sudah tidak perlu mengubah nuget.t target. Telah diperbaiki di nuget 2.8 ( http://nuget.codeplex.com/workitem/2921 ). Anda hanya perlu menyetel jalur repositori.
sumber
Dari Visual Studio 2013 Update 4 dan Nugget Package Manager versi> 2.8.5 ...
Buat file nuget.config di root repositori.
isi file:
Ini akan menyebabkan bahwa semua paket akan masuk ke folder paket pada level file nuget.config Anda.
Sekarang Anda dapat menggunakan setiap konsol nuget .sln dengan perintah 'update-package -reinstall'
Jika Anda memiliki beberapa repositori pada tingkat yang sama dan apa yang akan dibagikan folder paket yang sama di atasnya, coba gunakan cara untuk naik satu folder.
Tapi cara ini Anda menyebabkan referensi paket nuget csproj menunjuk satu folder di luar jalur repositori Anda.
sumber
Saya telah membuat paket NuGet yang secara transparan mengubah semua referensi NuGet dalam sebuah proyek ke dalam format $ (SolutionDir) -relatif. Itu melakukannya menggunakan transformasi XSLT waktu-build, jadi Anda tidak perlu meretas file proyek Anda dengan tangan. Anda dapat memperbarui paket Anda dengan bebas, itu tidak akan merusak apa pun.
https://www.nuget.org/packages/NugetRelativeRefs
Atau jika Anda menggunakan Visual Studio 2015 Update 3, Anda dapat memigrasi referensi paket ke
project.json
formulir seperti yang dijelaskan di sini: https://oren.codes/2016/02/08/project-json-all-the-thingssumber
Memperbarui pengalaman saya dengan nuget 2.8.3. Itu relatif sederhana. Semua lakukan adalah mengaktifkan pemulihan paket dari solusi klik kanan. Diedit NuGet.Config dan menambahkan baris ini:
Kemudian buat kembali solusinya, ia mengunduh semua paket ke folder yang saya inginkan dan memperbarui referensi secara otomatis. Saya melakukan hal yang sama untuk semua proyek saya yang lain, di mana hanya paket tambahan yang diunduh dan paket yang ada direferensikan. Oleh karena itu repositori paket umum untuk semua proyek yang telah ditetapkan.
Berikut adalah prosedur langkah demi langkah untuk mengaktifkan pemulihan paket.
http://blogs.4ward.it/enable-nuget-package-restore-in-visual-studio-and-tfs-2012-rc-to-building-windows-8-metro-apps/
sumber
Cukup tautkan / paket ke lokasi bersama yang diinginkan. Maka proyek Anda tidak akan rusak untuk pengguna lain, yang tidak memiliki lokasi paket khusus.
Buka prompt perintah sebagai admin dan gunakan
sumber
Untuk solusi signifikan apa pun, jawaban di atas akan gagal. Sederhananya, struktur ruang kerja TFS yang kompleks dengan jalur relatif yang berbeda, percabangan, proyek bersama, dll. Membuat satu repositori pusat tidak mungkin.
Menggunakan ($ SolutionDir) adalah langkah ke arah yang benar, tetapi pengkodean tangan file csproj dengan ($ SolutionDir) akan menjadi sangat membosankan dalam basis kode dengan ratusan paket yang diperbarui secara berkala (setiap kali pembaruan terjadi, HintPath akan ditimpa dengan jalur relatif baru). Apa yang terjadi jika Anda harus menjalankan Update-Package -Reinstall.
Ada solusi hebat yang disebut NugetReferenceHintPathRewrite . Ini mengotomatiskan injeksi ($ SolutionDir) ke dalam HintPaths sebelum membangun (tanpa benar-benar mengubah file csproj). Saya membayangkan itu dapat dengan mudah dimasukkan ke dalam sistem build otomatis
sumber
Ringkasan singkat bagi mereka di VS 2013 profesional dengan nuget Versi: 2.8.60318.667
Ini adalah cara Anda mengarahkan paket ke jalur yang terkait dengan folder .nuget:
Misalnya, jika solusi Anda (file .sln) berada di C: \ Projects \ MySolution, saat Anda mengaktifkan pemulihan paket NuGet, folder .nuget akan dibuat seperti ini: C: \ Projects \ MySolution.nuget dan paket akan diunduh ke direktori seperti ini: C: \ Projects \ MySolution \ Dependencies
CATATAN: Untuk beberapa alasan (tidak diketahui), setiap kali saya memperbarui "repositoryPath", saya harus menutup dan membuka kembali solusi agar perubahan diterapkan
sumber
untuk mereka yang menggunakan paket sebagai manajer paket mereka, ada opsi auto-symlink untuk file dependensi Anda:
btw: paket leverages nuget
referensi: https://fsprojects.github.io/Paket/dependencies-file.html
Jika Anda ingin memodifikasi sesedikit mungkin, Anda dapat membersihkan subdirektori secara berkala dengan skrip. yaitu. Perilaku default Nuget adalah menyalin file dari lokasi global ke folder paket lokal, jadi hapus file ini setelahnya.
sumber
Saya hanya menggunakan persimpangan NTFS untuk membuat semua folder paket langsung ke satu folder di atas akar repositori. Bekerja dengan baik. Tidak ada masalah dengan pemulihan paket paralel di berbagai solusi. Satu keuntungan dari ini adalah Anda tidak perlu mengonfigurasi ulang apa pun di kode sumber Anda, seperti ratusan jalur petunjuk relatif di file .csproj Anda. Ini 'hanya bekerja' dengan membiarkan sistem file menangani pengalihan dan simulasi folder paket tunggal.
Waspadai masalah 'git'. Meskipun 'status git' melalui baris perintah tidak menunjukkan perubahan tidak bertahap, saya perhatikan bahwa GitKraken melihat sambungan 'paket' sebagai file yang tidak diatur . Ia bahkan menunjukkan kesalahan seperti 'file adalah direktori' ketika Anda mengkliknya. GitKraken juga akan mencoba untuk menyimpan 'file' ini jika Anda melakukan rebase, menghancurkan junction, dan mengembalikannya sebagai file aktual yang berisi teks dengan path file asli. Perilaku yang sangat aneh. Mungkin bisa mengatasinya dengan memastikan file paket ditambahkan ke .gitignore Anda.
sumber
Ini adalah instruksi pada NuGet 2.1: http://docs.nuget.org/docs/release-notes/nuget-2.1
Tidak perlu mengedit file level solusi.
Bekerja dengan Visual Studio 2013 dan tiga proyek berbagi solusi.
Jangan lupa untuk mengupdate level solusi NuGet (setiap nuget.exe di folder .nuget).
sumber