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