如果 nuget 指定 PrivateAssets=all 为什么指定 IncludeAssets?

lon*_*nix 8 .net msbuild nuget .net-core

仅开发包(例如分析器、构建工具)的 nuget 安装页面通常显示以下内容:

<PackageReference Include="Foo" Version="1.2.3">
  <PrivateAssets>all</PrivateAssets>
  <IncludeAssets>runtime;build;native;contentfiles;analyzers;...</IncludeAssets>
</PackageReference>
Run Code Online (Sandbox Code Playgroud)

对于此类包,该PrivateAssets属性始终设置为all

IncludeAssets属性也始终被指定。肯定是多余的吗?

ziv*_*kan 12

compile资产未在 中列出InlcudeAssets,因此实际上它并不相同。缺少compile资产意味着如果包包含lib/或下的任何 dll ref/,您将无法调用这些 API,这是一件好事,因为该包不会被列为对您自己的包的依赖项。

如果您删除该IncludeAssets行并调用 API,那么任何使用您的包的人(并调用使用您的“privateassets=all”包引用的 API),那么在运行时将抛出 FileNotFoundException。

因此,拥有一条IncludeAssets删除线compile是一件好事,尽管可以通过将其替换为 来实现相同的效果<ExcludeAssets>compile</ExcludeAssets>,这样会更清晰。

我的直觉是这runtime也应该被排除,但我不知道为什么在实施此方案时从事 NuGet 的人们做出了不同的决定。

  • 很好的答案,谢谢。我也想知道这个问题。如果应该排除“runtime”,那么“native”不也应该被排除吗? (2认同)