如何隐藏依赖的 Nuget 包?

5

我有一个类库项目文件,像这样:

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

  <PropertyGroup>
    <TargetFramework>net6.0-windows</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="InformationLog" Version="2.1.1" />
  </ItemGroup>

</Project>

我的类库有各种公共类型,例如PublicClass1。Nuget包InformationLog有一个名为Log的公共类型。我的类库需要内部使用Log,但我不想让我的类库用户看到这个类型。我希望人们可以访问PublicClass1,但不能访问LogInformationLog中的任何其他类型或命名空间。
我可以接受将InformationLog作为依赖项,强制引用我的类库的项目也使用InformationLog nuget包,但我不希望该Nuget包中的类型可见。
理想情况下,我希望在我的项目文件中添加一些XML来解决这个问题。像这样:
  <PackageReference Include="InformationLog" Version="1.9.0" Access="Private"/>

有没有类似这样的方法可行?


你做不到这个。如果你的项目依赖于你的类库,而那个类库又依赖于一个NuGet包,那么你的项目也依赖于那个NuGet包。除非你对那个NuGet包有控制权,否则你无法以你所期望的方式限制可访问性。 - Kirk Woll
1个回答

11
您可以使用PrivateAssets="compile"
<PackageReference Include="InformationLog" Version="1.9.0" PrivateAssets="compile"/>
NuGet 关于资产选择的文档提供了更多细节。
您可以看到 Roslyn 等也利用了这一点:https://github.com/dotnet/roslyn-sdk/blob/1df5d394195ffcf6aab5b824ae420197ed1f0acc/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.Analyzer.Testing/Microsoft.CodeAnalysis.Analyzer.Testing.csproj#L58-L62 通过不将 runtime 资产设置为私有,这意味着运行时资产将被顺便传递,并且依赖项将被复制到 app 的 bin/ 文件夹中,避免在程序集调用依赖项上的API时出现 FileNotFoundError 异常。但由于您项目中的 compile 资产是私有的,因此它们不会被传递,因此包的消费者将无法直接调用您的包依赖项的 API,除非他们自己向相同的包添加 PackageReference,将其变成直接引用而不是传递包。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接