在生成时生成Nuget包不包括所有依赖项

时间:2020-10-28 21:20:35

标签: .net-core nuget nuget-package

我的解决方案树如下:

项目A

  • 引用Nuget软件包“某些软件包”

项目B

  • 参考项目A

在构建时,项目B会生成一个包,我们称其为PackageB

在ProjectB.csproj中,我使用了以下内容:

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

含义PackageBProjecdtB.dll之外,还包括ProjectA.dll

但是它不包含“ Some Package”,因此,当我启动引用PackageB的客户端时,出现运行时错误,抱怨缺少“ Some Package”中的dll。

如何确保添加“某些包装”作为PackageB的附属关系。我想在csproj中执行此操作,而不依赖于nuspec文件。这可能吗?

[编辑] 为了使ProjectA包含在PackageB中,我还需要提到我正在使用Teronis.MSBuild.Packaging.ProjectBuildInPackage

2 个答案:

答案 0 :(得分:0)

PackageReference文档中,PrivateAssets被描述为:

这些资产将被消耗,但不会流入父项目 意味着项目A的依赖项不会在软件包B中复制。

如果删除PrivateAssets节点,它应该正确地流动依赖关系。

答案 1 :(得分:0)

感谢您使用我的包裹。

让我们首先假设以下内容:

<!-- Project A -->
<ItemGroup>
  <PackageReference Include="SomePackage" Version="*" />
</ItemGroup>

<!-- Project B -->
<ItemGroup>
  <ProjectReference Include="ProjectA" PrivateAssets="all">
  <!--<PackageReference Include="Teronis.MSBuild.Packaging.ProjectBuildInPackage" Version="0.1.7" />-->
</ItemGroup>

您告诉 NuGet,您不希望项目 A 作为 NuGet 依赖项被选中。这是隐含的,您无法控制。 缺点是项目 A 的程序集,而不是项目 A 的包的程序集,不存在于项目 B 的包中。

通过删除 PrivateAssets="all",您可以禁用 NuGet 的隐式行为,并且项目 A 将被选择为 NuGet 依赖项和每个非依赖项包(也称为传递包)。

现在让我们假设:

<!-- Project A -->
<ItemGroup>
  <PackageReference Include="SomePackage" Version="*" />
</ItemGroup>

<!-- Project B -->
<ItemGroup>
  <ProjectReference Include="ProjectA" PrivateAssets="all">
  <PackageReference Include="Teronis.MSBuild.Packaging.ProjectBuildInPackage" Version="0.1.7" />
</ItemGroup>

通过安装我的包,我协助了 NuGet 的隐式行为:通过不选择项目 A 作为 NuGet 依赖项,将项目 A 生成的直接程序集复制到项目 B 的 bin 文件夹中。这有以下缺点:

由于隐式行为和我的包的使用,您在项目 B 中有项目 A 的程序集,这些程序集需要您在项目 A 中引用的包(在您的示例中为“某些包”)提供的程序集。所以解决方法是将项目 A 中的包显式添加到项目 B 中,如下所示:

<!-- Project A -->
<ItemGroup>
  <PackageReference Include="SomePackage" Version="*" />
</ItemGroup>

<!-- Project B -->
<ItemGroup>
  <ProjectReference Include="ProjectA" PrivateAssets="all">
  <PackageReference Include="Teronis.MSBuild.Packaging.ProjectBuildInPackage" Version="0.1.7" />
  <!-- Use the SAME version like in Project A. -->
  <PackageReference Include="SomePackage" Version="*" />
</ItemGroup>

这应该可以解决您的问题。当它不起作用时,请提供反馈。

相关问题