Home > Net >  If a nuget specifies PrivateAssets=all why specify IncludeAssets?
If a nuget specifies PrivateAssets=all why specify IncludeAssets?

Time:08-02

The nuget installation pages for development-only packages (e.g. analysers, build tools), typically show this:

<PackageReference Include="Foo" Version="1.2.3">
  <PrivateAssets>all</PrivateAssets>
  <IncludeAssets>runtime;build;native;contentfiles;analyzers;...</IncludeAssets>
</PackageReference>

For such packages, the PrivateAssets property is always set to all.

The IncludeAssets property is always specified too. Surely it's redundant?

CodePudding user response:

The compile asset is not listed in InlcudeAssets, so in fact it's not the same. The lack of compile assets means that if the package contains any dlls under lib/ or ref/, you won't be able to call those APIs, which is a good thing since the package won't be listed as a dependency on your own package.

If you remove that IncludeAssets line and call APIs, then anyone using your package (and calls an API which uses your "privateassets=all" package reference), then at runtime a FileNotFoundException will be thrown.

So, having an IncludeAssets line that removes compile is a good thing, although the same could be achieved by replacing it with <ExcludeAssets>compile</ExcludeAssets>, which would have been much clearer.

My gut feeling is that runtime should also be excluded, but I have no idea why the people working on NuGet at the time this was implemented made the different decision.

  • Related