复杂的NuGet依赖管理

时间:2018-06-06 16:01:08

标签: .net nuget csproj

我想提供一个我创建的项目的NuGet包,但是我有一些问题"隐藏" depencies。

以下配置是否可行?

  • 不要将项目引用包含为NuGet依赖项。
  • 允许消费者使用依赖关系A中的代码。
  • 完全隐藏消费者的依赖关系B.

要删除所有NuGet依赖项并隐藏B类依赖项,我尝试了以下操作:

<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
</PropertyGroup>

<!-- PrivateAssets to remove NuGet depencies -->
<ItemGroup>
    <ProjectReference Include="..\A.csproj" PrivateAssets="All" />
    <ProjectReference Include="..\B.csproj" PrivateAssets="All" />
</ItemGroup>

<ItemGroup>
    <BuildOutputInPackage Include="$(OutputPath)A.dll" />
    <!-- B is hidden, so not included -->
</ItemGroup>

问题在于,在运行时,内部NuGet代码崩溃,因为它无法找到依赖关系B及其依赖关系。 (这很明显,因为DLL不存在。)

1 个答案:

答案 0 :(得分:0)

PrivateAssets="All"实际上只有在对该包具有构建时依赖性时才有意义。

您想要的是控制B的资产流入项目本身。 这意味着你想禁止消费者对B进行编码。

实现此目的的方法是使用ExcludeAssets="compile"而不是PrivateAssets。

https://docs.microsoft.com/en-us/nuget/consume-packages/package-references-in-project-files#controlling-dependency-assets

所以你会得到以下结果:

<ItemGroup>
    <ProjectReference Include="..\A.csproj"/>
    <ProjectReference Include="..\B.csproj" ExcludeAssets="compile" />
</ItemGroup>