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

.net core 在生成时生成Nuget包不包括所有依赖项,.net-core,nuget,nuget-package,.net Core,Nuget,Nuget Package,我的解决方案的树如下所示: 项目A 参考Nuget包“一些包” 项目B 参考项目A 构建时,项目B生成一个包,我们称之为PackageB 在ProjectB.csproj中,我使用了以下内容: <ProjectReference Include="ProjectA.csproj"> <PrivateAssets>All</PrivateAssets> </ProjectReference>

我的解决方案的树如下所示:

项目A

  • 参考Nuget包“一些包”
项目B

  • 参考项目A
构建时,项目B生成一个包,我们称之为
PackageB

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

   <ProjectReference Include="ProjectA.csproj">
        <PrivateAssets>All</PrivateAssets>
    </ProjectReference>
<!-- 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>

全部的
含义
PackageB
,除了
ProjecdtB.dll
,还包括
ProjectA.dll

但是它不包含“Some Package”,因此当我启动一个引用
PackageB
的客户端时,我会收到一个运行时错误,抱怨“Some Package”中包含的dll丢失

如何确保“某些软件包”作为
PackageB
的依赖项添加。我希望在csproj中这样做,而不依赖nuspec文件。这可能吗

[编辑] 为了将ProjectA包含在PackageB中,我还需要提到我正在使用。

在文档中,
私有资产
描述为:

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


如果删除
PrivateAssets
节点,它应该可以正确地处理依赖项。

感谢您使用我的软件包

让我们首先假设以下情况:

   <ProjectReference Include="ProjectA.csproj">
        <PrivateAssets>All</PrivateAssets>
    </ProjectReference>
<!-- 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文件夹中。这有以下缺点:

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

<!-- 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>


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

如果我删除私有资产,引用的项目ProjectA将不再包含在包中。这很奇怪。您是否在任何地方使用
IncludeAssets
ExcludeAssets
?不,我不使用这些。我更新了我的帖子,因为我忘了提到我正在使用teronis包,以便在生成的包中包含项目引用。实现这一点的最佳方法是放弃使用
teronis
nuget包,并删除
All
节点。它将使ProjectA成为ProjectB的nuget依赖项。您还应该将ProjectA打包为nuget包。对于所有这些软件包,当您安装软件包B时,将同时安装软件包A,然后在安装软件包A时将安装一些软件包。在这个过程中,包B还可以访问可传递的
一些包
。我不认为这是“最好的方法”。这意味着每个项目都应该发布一个nuget包,即使是那些只应该在解决方案中用作项目引用并且包没有意义的项目。我终于遇到了这个github问题,并意识到在过去4年中,这一直是一个悬而未决的问题,微软没有采取任何行动。