我的解决方案树如下:
项目A
项目B
在构建时,项目B会生成一个包,我们称其为PackageB
在ProjectB.csproj中,我使用了以下内容:
<ProjectReference Include="ProjectA.csproj">
<PrivateAssets>All</PrivateAssets>
</ProjectReference>
含义PackageB
除ProjecdtB.dll
之外,还包括ProjectA.dll
但是它不包含“ Some Package”,因此,当我启动引用PackageB
的客户端时,出现运行时错误,抱怨缺少“ Some Package”中的dll。
如何确保添加“某些包装”作为PackageB
的附属关系。我想在csproj中执行此操作,而不依赖于nuspec文件。这可能吗?
[编辑] 为了使ProjectA包含在PackageB中,我还需要提到我正在使用Teronis.MSBuild.Packaging.ProjectBuildInPackage。
答案 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>
这应该可以解决您的问题。当它不起作用时,请提供反馈。