Memeriksa paket dari NuGet ke kontrol versi?

87

Sebelum NuGet, adalah 'praktik terbaik' yang diterima secara umum untuk check-in semua DLL eksternal yang digunakan pada suatu proyek. Biasanya di direktori Libsatau 3rdParty.

Saat bekerja dengan NuGet, apakah saya harus memeriksa packagesdirektori, atau adakah cara bagi MSBuild untuk mengunduh otomatis paket yang diperlukan dari umpan nuget?

Scott Weinstein
sumber
2
Jawabannya soal opini. Kamp "exclude / No" mempertahankan bahwa karena set fitur yang disediakan membuatnya mudah selama pengembangan dan membangun hanya dengan menarik dari repositori paket (misalnya nuget.org), itu hanya dapat dilakukan pada waktu pembangunan. Kamp "include / Yes" menyatakan bahwa kode tidak akan dibangun tanpa paket jika repositori eksternal tidak tersedia. Baca kedua sisi sebelum membuat keputusan. Lihat juga: softwareengineering.stackexchange.com/questions/301547/…
CJBS

Jawaban:

68

Tidak

Sejak pertanyaan ini ditanyakan, sekarang ada alur kerja yang mudah untuk menggunakan NuGet tanpa memasukkan paket ke kontrol sumber

Dari konsol manajer paket Anda, Anda perlu menginstal 'NuGetPowerTools' :

Install-Package NuGetPowerTools

Kemudian untuk mengaktifkan proyek Anda untuk mendukung pemulihan paket, Anda perlu menjalankan perintah lain:

Enable-PackageRestore

Sekarang Anda siap untuk memasukkan basis kode Anda tanpa folder paket. Perintah sebelumnya mengubah file proyek Anda sehingga jika ada paket yang hilang, mereka akan diunduh dan ditambahkan secara otomatis.

Sumber

Menggunakan NuGet tanpa memasukkan paket ke kontrol sumber

Edward Wilde
sumber
41
Mulai NuGet-1.6, Anda tidak lagi memerlukan NuGetPowerTools untuk melakukan ini. Cukup klik kanan pada Solusi di Solution Explorer dan pilih Enable NuGet Package Restore,. Lihat dokumennya .
Kaleb Pederson
3
Ya, Anda harus memeriksa folder .nuget dan file di bawahnya.
absynce
11
@Edward - Secara filosofis, mengapa Anda tidak menyertakan paket NuGet dalam kontrol sumber karena itu adalah dependensi? Apa yang diperiksa ke dalam kontrol sumber harus 100% kode cukup untuk membangun. Dengan tidak menyertakan paket NuGet ada dependensi eksternal yang dibuat, misalnya. bagaimana jika lokasi pengunduhan paket berubah, atau karena alasan yang aneh tidak lagi tersedia, dll. Atau lebih mungkin bagaimana jika ada sedikit perubahan pada paket yang kemudian diunduh ulang dan merusak build? Itu akan dihindari jika semua yang diperlukan untuk membangun proyek berada dalam kendali sumber.
Howiecamp
5
@ Howiecamp Saya sangat setuju. Saya tidak mengerti logikanya. Saya ingin kontrol sumber menjadi sistem yang sepenuhnya mandiri. Apalagi jika proyek tersebut terbilang lawas dan tidak diakses untuk sementara waktu. Saya ingin kembali dan membuatnya berfungsi tanpa modifikasi. Nuget adalah satu titik kegagalan yang tidak ingin saya miliki.
Telavian
2
@Howiecamp Solusi kami adalah meng-host server nuget kami sendiri - dan meletakkan semua paket nuget, internal sebagai eksternal, ke dalam GIT-LFS. Ini menghilangkan satu titik kegagalan dan menjaga semuanya tetap baik di bawah kendali versi. Tapi kami masih tidak memeriksa folder paket - dan kami masih menggunakan pemulihan paket otomatis
Casper Leon Nielsen
30

Iya. Pertimbangkan direktori "paket" untuk setara dengan direktori "libs" yang Anda sebutkan dalam pertanyaan Anda. Ini adalah pendekatan yang saya ambil secara pribadi dengan proyek OSS saya.

Kami sedang menyelidiki fitur-fitur yang memungkinkan MSBuild mengunduh otomatis paket-paket yang dibutuhkan, tetapi itu belum diimplementasikan (mulai NuGet 1.1).

Saya pikir beberapa orang mungkin telah mengimplementasikan fitur-fitur tersebut sendiri, tetapi rencana kami adalah untuk melihat fitur tersebut dibangun di NuGet 1.2 atau 1.3 semoga.

Haacked
sumber
10
Saya pasti ingin melihat fitur itu ditambahkan. Alangkah baiknya jika paket ditarik ke bawah seperlunya ke CI server atau dev PC, sehingga Anda dapat menghindari pembengkakan repositori kontrol sumber dengan DLL pihak ketiga.
John Mills
2
Jika manajer paket di studio visual dan alat baris perintah keduanya bisa "memperbaiki Paket" itu akan luar biasa.
Shaun Wilson
1
Mungkin akan lebih baik untuk menghapus / mengedit jawaban ini sekarang sudah usang
Lex
3
@Tim jawaban bukan saat ini imho
Edward Wilde
4
Jawaban ini masih berlaku. Pertimbangkan paket yang tidak ada di repositori global (tidak ada cara untuk memperbaiki / mendownloadnya). IMHO adalah praktik yang baik untuk menyimpan paket dalam sistem versi.
Pavel Hodek
6

Terlepas dari semua jawaban di sini, ini masih merupakan solusi yang mengerikan untuk tidak memiliki semua dependensi Anda di bawah "semacam" kontrol versi.

Untuk GIT, ini berarti GIT-LFS.

Episode terbaru dengan NPM menunjukkan alasannya: Jika repositori internet yang Anda andalkan rusak, tidak tersedia, dll., Maka Anda kacau bukan?

Anda tidak lagi dapat membuat barang - dan karena itu tidak dapat mengirimkannya.

Casper Leon Nielsen
sumber
1
Ini adalah poin yang sangat bagus. Bahkan jika kita memiliki server NuGet internal sendiri, dapatkah kita mengandalkannya untuk selalu tersedia selama pembuatan? Juga, seberapa sering paket kami berubah sehingga kami selalu membutuhkan salinan baru untuk setiap build?
Josh P
npmrusak karena tidak membatalkan daftar paket, itu benar-benar menghapusnya. NuGet tidak melakukan ini; jika pada titik tertentu Anda tidak dapat mengakses NuGet ada sesuatu yang tidak beres. Saya tidak berpikir bahwa menyimpan sembarang dependensi di git adalah solusi yang baik: cukup kunci dependensi Anda ke versi tertentu dan miliki cermin di antara Anda dan di internet jika itu penting bagi Anda.
Dan
2
"NuGet tidak melakukan ini". Nah hudiluhu Anda baru saja membuat janji untuk masa depan domain yang sepenuhnya di luar kendali Anda. Dalam dunia nyata hal-hal di luar kendali Anda, nah itu di luar kendali Anda. Ini berlaku untuk NuGet, serta Npm. Lebih jauh lagi, gagasan Anda tentang "cermin" adalah persis seperti yang saya usulkan di sini, tetapi di dunia Anda "cermin" tidak didukung oleh skema kontrol versi apa pun. Sekali lagi Anda belum menyelesaikan masalah yang Anda tetapkan.
Casper Leon Nielsen
5

Sejak mengajukan pertanyaan tersebut, saya telah menerapkan pendekatan berikut sehingga saya tidak perlu memeriksa di direktori Paket toplovel .

Dalam file build.msbuild tingkat atas:

<Target Name="NuGet">
    <ItemGroup>
       <NuGetPackage Include="*\packages.config" />
    </ItemGroup>
    <Exec Command='libs\NuGet.exe install "%(NuGetPackage.FullPath)" -o Packages'  />

    <!-- optional for project that has JavaScript content -->
    <CreateItem Include="Packages\*\Content\Scripts\*">
       <Output TaskParameter="Include" ItemName="NuGetJSFiles"/>
    </CreateItem>
    <Copy SourceFiles="@(NuGetJSFiles)" DestinationFolder="MainProj\Scripts\" OverwriteReadOnlyFiles="true" SkipUnchngedFiles="true" />
    <Delete Files="MainProj\Scripts\.gitignore" />
    <WriteLinesToFile File="MainProj\Scripts\.gitignore" Lines="%(NuGetJSFiles.Filename)%(NuGetJSFiles.Extension)" /
    <Delete Files="@(PostNuGetFiles)" />
</Target>

Di setiap file project.csproj

<Target Name="BeforeBuild">
    <Error Condition="!Exists('..\Packages\')" Text="You must run &gt; msbuild build.msbuild to download required NuGet
Packages" />

    <!-- optional for project that has JavaScript content -->
   <ReadLinesFromFile File="Scripts\.gitignore">
     <Output TaskParameter="Lines" ItemName="ReqJSFiles" />
   </ReadLinesFromFile>
   <Message Text="@(ReqJSFiles)" />
   <Error Condition="!Exists('Scripts\%(ReqJSFiles.Identity)')" Text="You must run &gt; msbuild build.msbuild to download required NuGet JS Package - Scripts\%(ReqJSFiles.Identity)" />
 </Target>
Scott Weinstein
sumber
2
Ini berfungsi, tetapi hari ini, yang terbaik adalah menggunakan pemulihan paket
Scott Weinstein
4

Saya menyadari kenyataannya berbeda ketika pertanyaan ini awalnya diposting dan dijawab, tetapi untungnya jawabannya sedikit berubah. Sekarang dimungkinkan untuk menggunakan NuGet untuk mengunduh dependensi melalui MSBuild menggunakan acara Pra-Build. Anda tidak perlu meletakkan folder paket di repositori kode Anda, semua dependensi akan diunduh dan / atau diperbarui pada build. Ini mungkin solusi, tetapi terlihat cukup layak. Lihat entri blog berikut untuk detailnya: http://blog.davidebbo.com/2011/03/using-nuget-without-committing-packages.html

Pawel Krakowiak
sumber
4
Saya sangat senang sampai saya ingat bahwa ini memerlukan server build untuk mengakses repositori NuGet, dan ini bukan satu-satunya tempat saya bekerja di mana server build tidak dapat melihat internet. Saya hanya akan kembali untuk memeriksa pohon paket di ...
piers7
3

Posting ini sudah sangat usang. Jawabannya tetap TIDAK, tetapi solusinya telah berubah. Mulai NuGet 2.7+ Anda dapat mengaktifkan pemulihan paket otomatis tanpa menyertakan file NuGet.exe di sumber Anda (ini tidak diinginkan untuk sedikitnya) dan jika Anda menggunakan DVCS modern, Anda dapat mengabaikan folder paket. Jika Anda memerlukan kustomisasi khusus, Anda dapat membuat file nuget.config di root solusi.

http://docs.nuget.org/docs/reference/package-restore

Selain itu, dengan format csproj yang baru, Anda juga dapat menghindari file nuget.config tambahan karena sudah terintegrasi sekarang. Silakan lihat posting ini yang menjelaskan itu lebih baik:

Haruskah folder .nuget ditambahkan ke kontrol versi?

Jeremy
sumber