簡體   English   中英

將參考項目的依賴添加到 NuGet package

[英]Add dependencies of reference projects to NuGet package

我正在使用dotnet pack命令為以下場景創建 NuGet package:

項目結構:

Project B
|----> Project A

Project A
|----> SomePackage

I want to create a single NuGet package the contains ProjectB.dll , ProjectA.dll , and SomePackage as NuGet package dependency.

In order to include ProjectA.dll as part of the NuGet package (and not package dependency), I used the following solution that suggests here .

ProjectB.csproj中:

  <ProjectReference Include="ProjectA.csproj" PrivateAssets="all"/>

  <PropertyGroup>
    <TargetsForTfmSpecificBuildOutput>$(TargetsForTfmSpecificBuildOutput);CopyProjectReferencesToPackage</TargetsForTfmSpecificBuildOutput>
  </PropertyGroup>
  
  <Target Name="CopyProjectReferencesToPackage" DependsOnTargets="BuildOnlySettings;ResolveReferences">
    <ItemGroup>
      <!-- Filter out unnecessary files -->
      <_ReferenceCopyLocalPaths Include="@(ReferenceCopyLocalPaths->WithMetadataValue('ReferenceSourceTarget', 'ProjectReference')->WithMetadataValue('PrivateAssets', 'All'))"/>
    </ItemGroup>

    <!-- Print batches for debug purposes -->
    <Message Text="Batch for .nupkg: ReferenceCopyLocalPaths = @(_ReferenceCopyLocalPaths), ReferenceCopyLocalPaths.DestinationSubDirectory = %(_ReferenceCopyLocalPaths.DestinationSubDirectory) Filename = %(_ReferenceCopyLocalPaths.Filename) Extension = %(_ReferenceCopyLocalPaths.Extension)" Importance="High" Condition="'@(_ReferenceCopyLocalPaths)' != ''" />

    <ItemGroup>
      <!-- Add file to package with consideration of sub folder. If empty, the root folder is chosen. -->
      <BuildOutputInPackage Include="@(_ReferenceCopyLocalPaths)" TargetPath="%(_ReferenceCopyLocalPaths.DestinationSubDirectory)"/>
    </ItemGroup>
  </Target>

問題:

當我運行dotnet pack ProjectB.csproj時,我得到一個 package 包含 ProjectA.dll 和 Project B.dll,但沒有對SomePackage的依賴

問題:如何將SomePackage的依賴項添加到ProjectB NuGet package?

可能的解決方案:

  1. 手動將 package 引用從 ProjectB 添加到SomePackage
  2. 創建ProjectB.nuspec文件並手動將依賴項添加到SomePakcage

這兩種方法的缺點:我需要為ProjectA使用的每個 NuGet package 添加依賴項,這很容易忘記和破壞。

您已經為Project A使用了PrivateAssets="all" ,這意味着它的傳遞依賴項是私有的,並且不能被主Project B訪問。 我們通常使用它來禁用引用項目的依賴關系。

因此,如果您使用它,您將無法從引用的項目中獲取傳遞依賴項。 並且它將使項目 A成為一個組件 dll 並使其失去 nuget package 及其傳遞依賴項的能力。

如果您仍想實現目標,則應注意以下幾點:

1)直接將項目A的csproj中的PackageReference節點等傳遞依賴復制到項目B的csproj中。

 <PackageReference Include="SomePackage" Version="*.*.*" />

   ......

在這種情況下,您不必使用ProjectB.nuspec或 nuget package 管理器 UI。

2)放棄對項目 A使用PrivateAssets="all"並將項目 A 設為 nuget package。 確保其 nuget 功能的完整性。

除此之外,別無他法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM