【问题标题】:Add dependencies of reference projects to NuGet package将参考项目的依赖项添加到 NuGet 包
【发布时间】:2021-04-02 05:23:36
【问题描述】:

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

项目结构:

Project B
|----> Project A

Project A
|----> SomePackage

我想创建一个 NuGet 包,其中包含 ProjectB.dllProjectA.dllSomePackage 作为 NuGet 包依赖项。

为了将ProjectA.dll 作为NuGet 包的一部分(而不是包依赖项),我使用了建议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 时,我得到一个包含 ProjectA.dll 和 Project B.dll 的包,但 不依赖于 SomePackage

问题: 如何将依赖关系添加到SomePackageProjectB NuGet 包?

可能的解决方案:

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

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

【问题讨论】:

    标签: visual-studio .net-core nuget nuget-package dotnet-cli


    【解决方案1】:

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

    所以如果你使用它,你将无法从引用的项目中获取传递依赖。并且会使Project A成为一个汇编dll,并使其失去nuget包及其传递依赖的能力。

    如果你还想实现目标,你应该注意这些:

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

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

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

    2) 放弃将PrivateAssets="all" 用于Project A 并将Project A 作为nuget 包。确保其 nuget 功能的完整性。

    除此之外,别无他法。

    【讨论】:

    • 感谢您的回答。我想使用PrivateAssets="all",因为我只需要创建一个包含所有项目引用和所有包依赖项的 NuGet 包。选项 1 与我提到的相同,最大的缺点是,在我的例子中,示例更复杂,我有更多的项目参考,来自所有项目参考的约 20 个包参考,这意味着大量的手动工作 + 非常容易忘记依赖并创建错误的 NuGet 包(只能在运行时检测到)
    • + 你说得对,选项 2 也是一个很好的解决方案,但我不想将所有项目引用作为 NuGet 包公开给我的用户,我只需要一个 NuGet 包。跨度>
    • 当然。要解决它,您必须将引用的Project APackageReference 节点直接复制到Project B 中。毕竟Project A这个中间桥已经失去了它的Nuget特性,所以你必须将它的依赖节点添加到Project B。为了做到这一点,你必须这样做。
    • 这就是为什么我寻找一个简单的解决方案来自动添加所有依赖项,就像复制所有项目引用 dll 的解决方案一样。如果我有所有项目引用的所有 NuGet 依赖项的列表,这可能会有所帮助。
    • 直接将Porject A中的PackageReference 节点复制到Project B中,然后会自动在Project B上一次性安装nuget包,
    猜你喜欢
    • 2019-03-19
    • 2018-05-29
    • 1970-01-01
    • 1970-01-01
    • 2012-04-05
    • 1970-01-01
    • 2021-08-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多