如何隐藏依赖的 Nuget 包?

Nig*_*gel 6 c# xml nuget

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

<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>
Run Code Online (Sandbox Code Playgroud)

我的类库有各种公共类型,例如PublicClass1. Nuget 包InformationLog有一个名为 的公共类型Log。我的类库需要Log在内部工作,但我不想让这种类型对我的类库的用户可见。我希望人们可以访问PublicClass1但不能Log访问InformationLog.

我可以保留InformationLog作为依赖项,强制引用我的类库的项目也使用InformationLognuget 包,我只是不希望 Nuget 包中的类型可见。

理想情况下,我希望项目文件中包含一些 XML 来解决此问题。像这样的东西:

  <PackageReference Include="InformationLog" Version="1.9.0" Access="Private"/>
Run Code Online (Sandbox Code Playgroud)

有没有办法做类似的事情?

ziv*_*kan 12

您可以使用PrivateAssets="compile"

<PackageReference Include="InformationLog" Version="1.9.0" PrivateAssets="compile"/>
Run Code Online (Sandbox Code Playgroud)

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资产设为私有,这意味着运行时资产将可传递地流动,并且依赖项将被复制到应用程序bin/文件夹,并在程序集调用依赖项上的 API 时避免 FileNotFound 异常。但由于compile资产对于您的项目来说是私有的,因此它们不会传递,因此包使用者将无法直接调用包依赖项上的 API,除非他们自己将 PackageReference 添加到同一个包,使其成为直接引用,不是传递包。