我有一个像这样的类库项目文件:
<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
,但不能访问Log
或InformationLog
中的任何其他类型或名称空间。
我可以将InformationLog
作为依赖项,强制引用我的类库的项目也使用InformationLog
nuget包,我只是不希望nuget包中的类型可见。
理想情况下,我希望一些XML在我的项目文件来解决这个问题。像这样:
<PackageReference Include="InformationLog" Version="1.9.0" Access="Private"/>
有这样的方法吗?
您可以使用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
资产私有,这意味着运行时资产将传递地流动,并且依赖项将被复制到应用程序的bin/
文件夹中,并避免当您的程序集调用依赖项上的api时FileNotFound异常。但是由于compile
资产对你的项目来说是私有的,它们不会传递,因此包的使用者将不能直接调用你包的依赖项上的api,除非他们自己给同一个包添加了一个packagerreference,使它成为一个直接引用,而不是一个传递包。