Kiểm tra các gói từ NuGet vào kiểm soát phiên bản?


87

Trước NuGet, 'phương pháp hay nhất' được chấp nhận phổ biến là đăng ký tất cả các tệp DLL bên ngoài được sử dụng trong một dự án. Điển hình là trong một Libshoặc 3rdPartythư mục.

Khi làm việc với NuGet, tôi phải đăng ký packagesthư mục hay có cách nào để MSBuild tự động tải xuống các gói cần thiết từ nguồn cấp dữ liệu nuget?


2
Câu trả lời cho điều này là một vấn đề quan điểm. Trại "loại trừ / Không" duy trì điều đó vì bộ tính năng được cung cấp giúp dễ dàng trong quá trình phát triển và xây dựng chỉ cần lấy từ kho gói (ví dụ: nuget.org), nó có thể được thực hiện tại thời điểm xây dựng. Trại "bao gồm / Có" duy trì rằng mã sẽ không được xây dựng mà không có các gói nếu kho lưu trữ bên ngoài không khả dụng. Đọc cả hai phía trước khi đưa ra quyết định. Cũng xem: softwareengineering.stackexchange.com/questions/301547/…
CJBS

Câu trả lời:


68

Không

Vì câu hỏi này đã được hỏi nên bây giờ có một quy trình dễ dàng để sử dụng NuGet mà không giới hạn các gói để kiểm soát nguồn

Từ bảng điều khiển trình quản lý gói của bạn, bạn cần cài đặt 'NuGetPowerTools' :

Install-Package NuGetPowerTools

Sau đó, để cho phép các dự án của bạn hỗ trợ khôi phục gói, bạn cần chạy một lệnh khác:

Enable-PackageRestore

Bây giờ bạn đã sẵn sàng cam kết cơ sở mã của mình mà không có thư mục gói. Lệnh trước đó đã thay đổi các tệp dự án của bạn để nếu các gói bị thiếu, chúng sẽ tự động được tải xuống và thêm vào.

Nguồn

Sử dụng NuGet mà không cam kết gói với quyền kiểm soát nguồn


41
Kể từ NuGet-1.6, bạn không cần NuGetPowerTools để làm điều này nữa. Chỉ cần nhấp chuột phải vào Giải pháp trong Giải pháp Explorer và chọn Enable NuGet Package Restore,. Xem tài liệu .
Kaleb Pederson

3
Có, bạn phải kiểm tra thư mục .nuget và các tệp bên dưới nó.
absynce

11
@Edward - Về mặt triết lý, tại sao bạn không đưa các gói NuGet vào kiểm soát nguồn vì chúng là các gói phụ thuộc? Những gì được kiểm tra trong kiểm soát nguồn phải là 100% mã đủ cho một bản dựng. Bằng cách không bao gồm các gói NuGet, các phụ thuộc bên ngoài được tạo ra, ví dụ. Điều gì sẽ xảy ra nếu vị trí tải xuống gói thay đổi hoặc vì một số lý do kỳ lạ, nó không còn nữa, v.v. Hoặc nhiều khả năng hơn nếu có một số thay đổi nhỏ đối với gói sau đó được tải xuống lại và nó phá vỡ bản dựng? Điều đó sẽ tránh được nếu mọi thứ cần thiết để xây dựng dự án đều nằm trong sự kiểm soát của nguồn.
Howiecamp,

5
@Howiecamp Tôi không thể đồng ý hơn. Tôi không hiểu logic. Tôi muốn kiểm soát nguồn là một hệ thống hoàn toàn độc lập. Đặc biệt nếu dự án có phần kế thừa và không được truy cập trong một thời gian. Tôi muốn quay lại và để nó hoạt động mà không cần sửa đổi. Nuget là một điểm thất bại duy nhất mà tôi không muốn mắc phải.
Tiếng Telavian

2
@Howiecamp Giải pháp của chúng tôi là lưu trữ máy chủ nuget của riêng chúng tôi - và đặt tất cả các gói nuget, nội bộ như bên ngoài, vào GIT-LFS. Điều này loại bỏ điểm lỗi duy nhất và giữ mọi thứ độc đáo dưới sự kiểm soát của phiên bản. Nhưng chúng tôi vẫn không checkin các gói thư mục - và chúng tôi vẫn sử dụng gói tự động khôi phục
Casper Leon Nielsen

30

Đúng. Hãy xem thư mục "package" tương đương với thư mục "libs" mà bạn đã đề cập trong câu hỏi của mình. Đây là cách tiếp cận mà cá nhân tôi thực hiện với các dự án PMNM của mình.

Chúng tôi đang điều tra các tính năng cho phép MSBuild tự động tải xuống các gói cần thiết, nhưng điều đó chưa được triển khai (kể từ NuGet 1.1).

Tôi nghĩ rằng một số người có thể đã tự triển khai các tính năng như vậy, nhưng kế hoạch của chúng tôi là hy vọng sẽ xem xét việc tích hợp tính năng đó vào NuGet 1.2 hoặc 1.3.


10
Tôi chắc chắn muốn thấy tính năng đó được thêm vào. Sẽ rất tuyệt nếu có thể kéo các gói xuống khi cần thiết xuống máy chủ CI hoặc PC dev, để bạn có thể tránh làm đầy kho lưu trữ kiểm soát nguồn với các tệp DLL của bên thứ ba.
John Mills

2
Nếu trình quản lý gói trong studio trực quan và công cụ dòng lệnh đều có thể "sửa chữa các Gói" thì điều đó thật tuyệt vời.
Shaun Wilson,

1
Có lẽ nó sẽ là tốt để loại bỏ / chỉnh sửa câu trả lời này bây giờ nó là lỗi thời
Lex

3
Câu trả lời @ Tim không phải là IMHO hiện tại
Edward Wilde

4
Câu trả lời này vẫn còn hiện tại. Xem xét các gói không có trong kho lưu trữ toàn cầu (không có cách nào để sửa chữa / tải xuống). IMHO nên lưu trữ các gói trong hệ thống lập phiên bản.
Pavel Hodek

6

Bất chấp tất cả các câu trả lời ở đây, nó vẫn là một giải pháp tồi tệ đơn giản là không có tất cả các phụ thuộc của bạn dưới "một số loại" kiểm soát phiên bản.

Đối với GIT, điều này có nghĩa là GIT-LFS.

Tập gần đây với NPM cho thấy lý do tại sao: Nếu kho lưu trữ internet mà bạn phụ thuộc bị hỏng, không khả dụng, v.v., thì bạn đã bị hỏng rồi phải không?

Bạn không còn có thể xây dựng nội dung của mình - và do đó không thể phân phối.


1
Đây là một điểm rất tốt. Ngay cả khi chúng tôi có máy chủ NuGet nội bộ của riêng mình, chúng tôi có thể dựa vào nó để luôn sẵn sàng trong quá trình xây dựng không? Ngoài ra, các gói của chúng tôi thay đổi bao lâu một lần mà chúng tôi luôn cần để có được một bản sao mới cho mọi bản dựng?
Josh P

npmđã phá vỡ vì nó không hủy niêm yết các gói, nó thực sự đã xóa chúng. NuGet không làm điều này; nếu tại bất kỳ thời điểm nào bạn không thể truy cập NuGet thì đã xảy ra lỗi nghiêm trọng. Tôi không nghĩ rằng việc lưu trữ craptonne của các phụ thuộc trong git là một giải pháp tốt: chỉ cần khóa các phụ thuộc của bạn vào một phiên bản cụ thể và có một bản sao giữa bạn và trên internet nếu điều đó quan trọng với bạn.
Dan

2
"NuGet không làm điều này". Chà hudiluhu bạn vừa đưa ra lời hứa cho tương lai của một miền hoàn toàn nằm ngoài tầm kiểm soát của bạn. Trong thế giới thực, mọi thứ nằm ngoài phạm vi kiểm soát của bạn, chúng nằm ngoài phạm vi kiểm soát của bạn. Điều này áp dụng cho NuGet, cũng như Npm. Hơn nữa, ý tưởng của bạn về một "chiếc gương" chính xác là những gì tôi đề xuất ở đây, nhưng trong thế giới của bạn, "chiếc gương" không được hỗ trợ bởi bất kỳ loại kế hoạch kiểm soát phiên bản nào. Một lần nữa bạn vẫn chưa giải quyết được vấn đề bạn đặt ra.
Casper Leon Nielsen

5

Kể từ khi đặt câu hỏi, tôi đã đưa ra cách tiếp cận sau đây để tôi không phải kiểm tra các Gói cấp cao nhất .

Trong tệp build.msbuild ở mức cao nhất:

<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>

Trong mỗi tệp 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>

2
Tác phẩm này, nhưng những ngày này, tốt nhất để chỉ cần sử dụng built-in cho phép gói phục hồi
Scott Weinstein

4

Tôi nhận ra thực tế đã khác khi câu hỏi này đã được đăng và trả lời ban đầu, nhưng may mắn thay câu trả lời đã thay đổi một chút. Giờ đây, có thể sử dụng NuGet để tải xuống các phụ thuộc qua MSBuild bằng sự kiện Pre-Build. Bạn không cần đặt thư mục gói vào kho mã của mình, tất cả các phần phụ thuộc sẽ được tải xuống và / hoặc cập nhật khi xây dựng. Nó có thể là một cách giải quyết, nhưng nó trông đủ tốt. Xem bài đăng blog sau để biết chi tiết: http://blog.davidebbo.com/2011/03/using-nuget-without-committing-packages.html


4
Tôi đã rất phấn khích cho đến khi tôi nhớ rằng điều này yêu cầu máy chủ xây dựng phải truy cập vào kho lưu trữ NuGet và đây không phải là nơi duy nhất tôi làm việc tại nơi các máy chủ xây dựng không thể nhìn thấy internet. Tôi sẽ chỉ quay lại kiểm tra cây gói trong ...
piers


3

Bài đăng này đã trở nên rất lỗi thời. Câu trả lời vẫn là KHÔNG, nhưng giải pháp đã thay đổi. Kể từ NuGet 2.7+, bạn có thể bật khôi phục gói tự động mà không cần bao gồm tệp NuGet.exe trong nguồn của bạn (điều này là không mong muốn để nói rằng ít nhất) và nếu bạn sử dụng bất kỳ DVCS hiện đại nào, bạn có thể bỏ qua thư mục gói. Nếu bạn cần bất kỳ tùy chỉnh đặc biệt nào, bạn có thể tạo tệp nuget.config trong thư mục gốc giải pháp.

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

Ngoài ra, với định dạng csproj mới, bạn cũng có thể tránh các tệp nuget.config bổ sung vì nó đã được tích hợp ngay bây giờ. Vui lòng xem bài đăng này giải thích điều đó tốt hơn:

Có nên thêm thư mục .nuget vào kiểm soát phiên bản không?

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.