Tự động xây dựng Gói NuGet bao gồm các phần phụ thuộc được tham chiếu


83

Tôi muốn chạy kho lưu trữ NuGet cục bộ / nội bộ . Tôi nghĩ rằng tôi đã tìm ra cách "sử dụng lại" các gói NuGet hiện có bằng cách đưa chúng vào một dự án giả sử dụng NuGet và quét tệp gói để lấy .nupkgcác tệp được lưu trong bộ nhớ cache cục bộ của tôi , nhưng ...

Làm cách nào để bạn tạo một gói nuget ( .nupkg) từ một dự án, tự động bao gồm tất cả các phần dll phụ thuộc chứ không chỉ những phần được lấy qua NuGet?

Đặc biệt:

  1. Tạo một giải pháp
  2. Thêm một dự án mới
  3. Thêm tham chiếu đến các .dlltệp / dự án khác <- đây là phần còn thiếu
  4. Thêm gói NuGet qua trình quản lý gói / cmdline / bất cứ điều gì
  5. một cái gì đó tự động tạo ra.nupkg

Từ những gì tôi đã tìm thấy, bạn phải làm những việc như

  • chỉnh sửa thủ công .csprojtệp của bạn để thêm <BuildPackage>true</BuildPackage>vào để bao gồm các phụ thuộc
  • tạo .nuspectệp theo cách thủ công và liệt kê thủ công các phụ thuộc của bạn ( tương tự? )
  • chạy thủ công nuget packtrên .nuspectệp của bạn

Nhưng mọi thứ đều là thủ công, thật là ngu ngốc. Ngay cả các giải pháp bán tự động vẫn còn vụng về hoặc nửa thủ công:

Tôi sẽ giải quyết một cái gì đó tự động tạo một .nuspecbản kê khai từ các tham chiếu dự án. Sau đó, về mặt lý thuyết thì + sự kiện xây dựng nuget có thể được cuộn lại thành một gói xây dựng dự án / nuget, đó là những gì tôi thực sự muốn thấy.


Tôi chỉ tình cờ gặp này mở rộng VS eyecatch.no/projects/nuget-package-template mà tôi sẽ cần phải nhìn vào ...
drzaus

3
Năm năm sau và thông số kỹ thuật hoặc gói nuget 4.x vẫn không thể xác định sự phụ thuộc.
StingyJack,

Có bản cập nhật cho vấn đề này không? Hay bạn vẫn gặp những vấn đề này?
Dominic Jonas

Tôi đã từ bỏ trên này lúc trước, nhưng hãy kiểm tra NuProj theo báo cáo của câu trả lời này
drzaus

Vấn đề này vẫn tồn tại. :(
BrainSlugs83 Ngày

Câu trả lời:


75

Điểm # 3 của bạn ( Thêm tham chiếu đến các tệp .dll khác nhau / các dự án khác <- đây là phần còn thiếu ) thực sự chứa hai vấn đề khác nhau: (1) thêm tham chiếu đến các tệp dll khác nhau và (2) thêm tham chiếu đến các dự án khác trong cùng một giải pháp.

Số (2) ở đây đã nhận được một số hỗ trợ bổ sung kể từ NuGet 2.5 . Bạn có thể thêm một tùy chọn để bao gồm các tham chiếu đến các dự án khác trong cùng một giải pháp khi tạo gói NuGet cho một dự án:

nuget pack projectfile.csproj -IncludeReferencedProjects

Nếu projectfile.csprojtham chiếu đến bất kỳ dự án nào khác trong giải pháp của bạn cũng được hiển thị dưới dạng gói NuGet, thì các gói NuGet của dự án này sẽ được thêm vào dưới dạng phụ thuộc. Nếu nó tham chiếu đến các dự án trong giải pháp của bạn không hiển thị dưới dạng gói NuGet, thì các dll của chúng sẽ được bao gồm trong gói NuGet này.

Đối với (1), nếu bạn thấy mình thường xuyên thêm dll vào các dự án của mình mà không có sẵn dưới dạng gói NuGet, bạn chỉ có thể tạo các gói NuGet (nội bộ) của riêng mình với các tệp này. Nếu sau đó bạn thêm các hình nền này dưới dạng gói NuGet thay vì trực tiếp các tệp, thì gói NuGet này sẽ là một phần phụ thuộc trong gói NuGet của dự án của bạn.


3
thở dài # 1 vẫn còn quá thủ công đối với thị hiếu của tôi. Trên thực tế, "tạo gói NuGet (nội bộ) của riêng bạn với các tệp này" là điều tôi đang cố gắng làm - toàn bộ điểm của câu hỏi này là tôi muốn tự động cuộn .dlls không phải NuGet vào một gói NuGet. Không phải đi qua và liệt kê từng dll theo cách thủ công trong a .nuspec, mà tôi nghĩ đó là những gì bạn đang đề xuất?
drzaus

Bạn không cần phải chỉ định từng DLL riêng biệt. Đó thực sự sẽ là công việc nhiều nếu bạn có nhiều người trong số họ. Khi liệt kê các tệp cần bao gồm, bạn có thể sử dụng các ký tự đại diện (đệ quy) ( docs.nuget.org/docs/reference/… ), vì vậy, nếu chẳng hạn, nếu bạn đặt tất cả các tệp DLL này trong một thư mục riêng biệt, nó sẽ là một lớp lót để bao gồm khu mua sắm.
Julian

À, bây giờ tôi đã đến nơi bạn đang đi - vì vậy nếu tôi tạo một dự án trình bao bọc, hãy bao gồm các tham chiếu thông qua "dự án nhấp chuột phải> Thêm tham chiếu" thông thường, sau đó tôi có thể tạo một nuspecbao gồm mọi thứ trong binthư mục (giả sử các tham chiếu của tôi đều là "sao chép cục bộ"), nó sẽ tự động chọn bất cứ thứ gì tôi đã thêm. Có vẻ hơi hamfisted một chút, nhưng có lẽ sẽ hiệu quả.
drzaus

6
Nó sẽ không tự động chọn bất cứ thứ gì có trong thư mục bin của bạn, bạn phải chỉ định nó một cách rõ ràng, đại loại như sau:<file src="bin\release\*.dll" target="lib" />
Julian

2
Chú ý xứng đáng, nếu các dự án đang được tham chiếu xảy ra để có một tập tin nuspec sau đó NuGet sẽ coi đó như một gói và không bao gồm trong thư mục lib nhưng sẽ thêm nó vào các phụ thuộc gói
workabyte

5

Đối với những nhân viên Google khác, bạn có thể sử dụng điều này nếu bạn đang sử dụng tệp NuGet.targets để chạy NuGet Pack:

<Target Name="PrePackage" BeforeTargets="BuildPackage">
  <PropertyGroup>
    <BuildCommand>$(BuildCommand) -IncludeReferencedProjects</BuildCommand>
  </PropertyGroup>
</Target>

7
Nghe có vẻ hứa hẹn nhưng không đủ thông tin để thực hiện. Bạn nói đến tệp NuGet.targets này là gì? Tôi quen thuộc với các tập tin xây dựng mục tiêu nói chung nhưng không phải trường hợp cụ thể này sử dụng
bikeman868

2

Kiểm tra điều này!

Giải pháp mà tôi tìm thấy là một tiện ích mở rộng cho Visual Studio: https://visualstudiogallery.msdn.microsoft.com/fbe9b9b8-34ae-47b5-a751-cb71a16f7e96/view/Reviews

Bạn chỉ cần thêm dự án mới có tên Gói Nuget Gói NuGet

Sau đó, bạn đang thêm các dự án thú vị của bạn vào tài liệu tham khảo và BOOOM !! Tất cả các phụ thuộc và thư mục tệp được thêm tự động. Nếu bạn muốn sửa đổi dữ liệu NuSpec, bạn nhấp chuột phải vào dự án và đi tới Thuộc tính, sau đó sửa đổi những gì bạn muốn. NuSpec và nupkg đã tạo sẽ nằm trong thư mục obj của dự án mới của bạn. Tôi hy vọng nó sẽ giúp;).


1
Cũng có một giải pháp cho VS2017?
Dominic Jonas

Điều này không hoạt động trong trường hợp tạo các gói trên máy chủ xây dựng.
Michi-2142,

Thật tệ là điều này không còn được dùng nữa. Sẽ có ích.
joelc

2

Tôi tìm thấy một bài báo viết tốt về chủ đề này. Tôi gặp vấn đề tương tự với một số gói nhất định có hệ thống phân cấp phụ thuộc và cho đến bây giờ tôi vẫn đang tải từng gói lên dưới dạng một gói NuGet riêng biệt (cái gì. A. Lãng phí thời gian)

Tôi vừa thử nghiệm giải pháp được tìm thấy ở đây: https://dev.to/wabbbit/include-both-nuget-package-references-and-project-reference-dll-using-dotnet-pack-2d8p

Và sau khi kiểm tra gói NuGet bằng cách sử dụng NuGet Package Explorer, các tệp DLL được tạo ra bởi các dự án được tham chiếu thực sự hiện diện. Tôi sẽ kiểm tra bằng cách thực sự gửi gói này cho NuGet và thử nghiệm nó.

Đây là nguồn của tôi trong trường hợp nó hữu ích cho bạn: https://github.com/jchristn/NuGetPackTest

Và gói NuGet thử nghiệm: https://www.nuget.org/packages/NuGetPackTest/1.0.0

Giải pháp dường như hoạt động tốt. Tôi không biết nó sẽ như thế nào khi có nhiều lớp tham chiếu, tôi chắc rằng nó có thể rất rậm rạp và rất nhanh.

nhập mô tả hình ảnh ở đây

.csproj từ thư viện NuGetPackTest có tham chiếu đến TestLibrary của dự án (các phần đã bị xóa cho ngắn gọn)

<Project Sdk="Microsoft.NET.Sdk">
 
  <PropertyGroup>
    <TargetFrameworks>netstandard2.0;netcoreapp3.0;netcoreapp3.1;net461</TargetFrameworks>
    ...
    <GeneratePackageOnBuild>true</GeneratePackageOnBuild>

    <!-- added this line -->
    <TargetsForTfmSpecificBuildOutput>$(TargetsForTfmSpecificBuildOutput);CopyProjectReferencesToPackage</TargetsForTfmSpecificBuildOutput>
  </PropertyGroup>

  <ItemGroup>

    <!-- modified this ProjectReference to include the children ReferenceOutputAssembly and IncludeAssets -->
    <ProjectReference Include="..\TestLibrary\TestLibrary.csproj">
      <ReferenceOutputAssembly>true</ReferenceOutputAssembly>
      <IncludeAssets>TestLibrary.dll</IncludeAssets>
    </ProjectReference>
  </ItemGroup>

  <!-- added this section -->
  <Target DependsOnTargets="ResolveReferences" Name="CopyProjectReferencesToPackage">
    <ItemGroup>
      <BuildOutputInPackage Include="@(ReferenceCopyLocalPaths->WithMetadataValue('ReferenceSourceTarget', 'ProjectReference'))"/>
    </ItemGroup>
  </Target>
  
</Project>

1
điều này đã giải quyết vấn đề của tôi ngay lập tức. Tôi đã làm theo hướng dẫn như đã đề cập trong liên kết và nó đã hoạt động. Rất vui khi có thêm ý chính trong câu trả lời của bạn.
Jabez
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.