2017-08-26 38 views
8

Tôi có một dự án cốt lõi asp.net xây dựng đúng với VS nhưng không xây dựng theo msbuild.dotnet khôi phục lại so với nuget khôi phục lại với teamcity

Nó không tìm thấy tất cả các libs chung (hệ thống, vv)

Tôi đang sử dụng TeamCity và một phần của quá trình xây dựng được một NuGet khôi phục.

Tôi đã cố gắng thực hiện các bước tương tự như teamcity, nhưng bằng tay với msbuild và không thành công, không tìm thấy libs.

Tôi đã thêm bước khôi phục dotnet và sau đó nó hoạt động.

Vì vậy, sự khác biệt giữa một mũi tên khôi phục và khôi phục dotnet là gì?

+0

tôi nghi ngờ rằng kể từ khi DotNet khôi phục lại làm việc nhưng NuGet không rằng NuGet về Đội City là một phiên bản cũ mà không làm hiểu về PackageReferences. NuGet sẽ cần phải có ít nhất phiên bản 4.0. –

+0

Chúng tôi đang gặp vấn đề tương tự, trong đó dotnet khôi phục hoạt động nhưng không khôi phục được. Và đối với chúng tôi, điều đó xảy ra cả trên TeamCity và tại địa phương. – r12

Trả lời

13

Cả nuget restoredotnet restore đều giống nhau: Chúng thực hiện thao tác khôi phục nuget.

Sự khác biệt duy nhất: dotnet restore là trình bao bọc tiện lợi để gọi số dotnet msbuild /t:Restore yêu cầu khôi phục tích hợp msbuild. Điều này chỉ hoạt động trên các bản phân phối msbuild bao gồm NuGet, chẳng hạn như VS 2017 (đầy đủ VS, công cụ xây dựng) hoặc Mono 5.2+ (=>msbuild /t:Restore) và .NET Core Sdk cung cấp lệnh tiện lợi này.

Tại thời điểm này, có 2 cách như thế nào gói NuGet thể được sử dụng trong các dự án (3 thực sự nhưng chúng ta hãy bỏ qua project.json trên UWP cho thời điểm này):

  • packages.config: Cách "cổ điển" của tham khảo Gói NuGet. Điều này giả định NuGet là một công cụ riêng biệt và msbuild không biết gì về NuGet. Một ứng dụng NuGet như nuget.exe hoặc công cụ tích hợp VS thấy tệp packages.config và tải xuống các gói được tham chiếu vào thư mục cục bộ khi khôi phục. Một gói cài đặt sửa đổi dự án để tham chiếu tài sản ra khỏi thư mục cục bộ này. Vì vậy, một khôi phục cho một dự án packages.config chỉ tải xuống các tệp.
  • PackageReference: Dự án chứa các mục MSBuild tham chiếu đến gói NuGet. Không giống như packages.config, chỉ phụ thuộc trực tiếp được liệt kê và tệp dự án không trực tiếp tham chiếu bất kỳ nội dung nào (tệp dll, tệp nội dung) ra khỏi gói. Khi khôi phục, NuGet tìm ra biểu đồ phụ thuộc bằng cách đánh giá phụ thuộc trực tiếp và chuyển tiếp, đảm bảo tất cả các gói được tải xuống bộ đệm gói chung của người dùng (không phải giải pháp cục bộ để chỉ tải xuống một lần) và ghi tệp nội dung vào thư mục obj chứa danh sách tất cả các gói và nội dung mà dự án sử dụng, cũng như các mục tiêu msbuild bổ sung nếu gói nào chứa logic xây dựng cần được thêm vào dự án.Vì vậy, một khôi phục nuget có thể tải xuống các gói nếu chúng chưa có trong bộ đệm ẩn toàn cầu và tạo tệp tài sản này. Ngoài các tham chiếu gói, dự án cũng có thể tham khảo các công cụ CLI, đó là các gói NuGet chứa các lệnh bổ sung sẽ có sẵn cho dotnet trong thư mục dự án.

Các msbuild tích hợp phục hồi chỉ làm việc cho các dự án PackageReference loại (NET Standard, NET Lõi theo mặc định nhưng opt-in cho bất kỳ dự án NET) và không cho packages.config dự án. Nếu bạn sử dụng phiên bản mới của nuget.exe (ví dụ: 4.3.0), nó có thể khôi phục cả hai loại dự án.

Lỗi của bạn về các loại bị thiếu là thú vị hơn một chút: "Các bộ tham chiếu" (các thư viện được truyền làm đầu vào cho trình biên dịch) không được cài đặt trên hệ thống nhưng đi qua gói NuGet. Vì vậy, miễn là các gói NuGet bị thiếu trong bộ đệm gói toàn cầu hoặc tệp obj/project.assets.json chưa được tạo bởi một thao tác khôi phục, các kiểu cơ bản như System.Object sẽ không có sẵn cho trình biên dịch.

+0

Điều này làm rõ mọi thứ rất nhiều! cảm ơn bạn! Trong ánh sáng đó, có lý do nào để sử dụng cơ chế package.config nữa không? – Thomas

+1

Tính năng 'nội dung' (sao chép các tệp vào nguồn của dự án tiêu thụ) đã bị xóa và được thay thế bằng tính năng' contentFiles'. Ngoài ra, 'PackageReference' chỉ hoạt động trong VS 2017+ (NuGet 4. *, MSBuild 15+) –

-1

Khôi phục bộ nhớ sẽ đảm bảo tất cả các phụ thuộc nuget của bạn được tải xuống và khả dụng cho dự án của bạn. Trong khi dotnet khôi phục lại là một sự phục hồi hoàn toàn của tất cả các phụ thuộc nuget cũng như tài liệu tham khảo và các công cụ cụ thể dự án. Có nghĩa là nếu bạn chạy khôi phục nuget, bạn chỉ có chỉ khôi phục gói nuget.

Theo docs.microsoft.com: Dotnet Restore

Các DotNet khôi phục lệnh sử dụng NuGet để khôi phục lại phụ thuộc cũng như các công cụ dự án cụ thể được quy định trong hồ sơ dự án ...

+0

'nuget.exe restore' cũng tương tự như' dotnet restore' cho các dự án kiểu 'PackageReference'. –

0

Tôi đã gặp sự cố tương tự với dự án .net lõi 2 sẽ xây dựng tốt trên máy trạm của tôi - cả trong Visual Studio 2017 và chỉ sử dụng msbuild - nhưng không xây dựng trong TeamCity. Các errormessage là:

C:\Program Files\dotnet\sdk\2.1.4\Sdks\Microsoft.NET.Sdk\build\Microsoft.PackageDependencyResolution.targets(327, 5): 
Assets file 'D:\TeamCity\buildAgent\work\596486b1d4e7a8e7\Source\Integrations\SomeAPI\obj\project.assets.json' not found. 
Run a NuGet package restore to generate this file. 

Trong cấu hình build của tôi, tôi đã có một NuGet Cài đặt bước trước khi xây dựng các bước:

  • NuGetversion: 3.4.4
  • Restore Mode: Cài đặt

Hóa ra tôi phải sử dụng:

  • NuGet phiên bản: 4.0.0 hoặc cao hơn
  • Restore Mode: Restore (Cần NuGet 2.7+)
Các vấn đề liên quan