首页 > 解决方案 > 将参考项目的依赖项添加到 NuGet 包

问题描述

我正在使用dotnet pack命令为以下场景创建 NuGet 包:

项目结构:

Project B
|----> Project A

Project A
|----> SomePackage

我想创建一个包含ProjectB.dll、、ProjectA.dllSomePackage作为 NuGet 包依赖项的 NuGet 包。

为了包含ProjectA.dll在 NuGet 包中(而不是包依赖项),我使用了此处建议的以下解决方案。

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,我得到一个包含 ProjectA.dll 和 Project B.dll 的包,但不依赖于SomePackage.

问题: 如何将依赖项添加SomePackageProjectBNuGet 包?

可能的解决方案:

  1. 手动将 ProjectB 中的包引用添加到SomePackage.
  2. 创建ProjectB.nuspec文件并手动将依赖项添加到SomePakcage.

这两种方法的缺点:我需要为每个ProjectA使用的 NuGet 包添加依赖项,这很容易忘记和破坏。

标签: visual-studio.net-corenugetnuget-packagedotnet-cli

解决方案


您已用于PrivateAssets="all"Project A ,这意味着它的传递依赖项是私有的,主Project B无法访问。我们通常使用它来禁用引用项目的依赖关系。

因此,如果您使用它,您将无法从引用的项目中获取传递依赖项。并且它会使项目A成为一个程序集dll,并使其失去nuget包的能力及其传递依赖。

如果您仍想实现目标,则应注意以下几点:

1)直接将PackageReferenceProject A的csproj中的node等传递依赖复制到Project B的csproj中。

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

   ......

在这种情况下,您不必使用ProjectB.nuspec或 nuget 包管理器 UI。

2)放弃使用PrivateAssets="all"项目A,将项目A作为nuget包。确保其 nuget 功能的完整性。

除此之外,别无他法。


推荐阅读