将多项目打包为单个NuGet包时遭遇NU1101错误的排查
你的聚合项目中添加的<ProjectReference>会被NuGet自动解析为NuGet依赖项,写入最终包的.nuspec文件中。即使你手动将两个项目的DLL打包到MyGenerators包内,NuGet依然会尝试查找这两个不存在的独立包(MyProject.SourceGenerators和MyProject.SourceGenerators.Core),从而抛出NU1101错误。
需要修改聚合项目的配置,阻止ProjectReference生成不必要的依赖项声明,并确保被引用项目的输出正确打包:
修改ProjectReference配置,阻止生成依赖项
在每个<ProjectReference>节点中添加<IncludeAssets>none</IncludeAssets>,告诉NuGet不要将这些项目引用作为包依赖项处理:<ItemGroup> <ProjectReference Include="$(SrcPath)\MyProject.SourceGenerators\MyProject.SourceGenerators.csproj" PrivateAssets="all" IncludeAssets="none" /> <ProjectReference Include="$(SrcPath)\MyProject.SourceGenerators.Core\MyProject.SourceGenerators.Core.csproj" PrivateAssets="all" IncludeAssets="none" /> </ItemGroup>确保被引用项目不单独打包
在MyProject.SourceGenerators.csproj和MyProject.SourceGenerators.Core.csproj的<PropertyGroup>中添加:<IsPackable>false</IsPackable>避免这两个项目被单独生成NuGet包,同时不影响聚合项目引用它们的输出文件。
验证打包后的依赖项
打包后可以用NuGet包浏览器打开MyGenerators.nupkg,检查.nuspec文件的<dependencies>节点,确认不再包含MyProject.SourceGenerators和MyProject.SourceGenerators.Core的依赖声明。
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>netstandard2.0</TargetFramework> <IncludeBuildOutput>false</IncludeBuildOutput> <IsPackable>true</IsPackable> <NoWarn>$(NoWarn);NU5128</NoWarn> <PackageId>MyGenerators</PackageId> </PropertyGroup> <ItemGroup> <ProjectReference Include="$(SrcPath)\MyProject.SourceGenerators\MyProject.SourceGenerators.csproj" PrivateAssets="all" IncludeAssets="none" /> <ProjectReference Include="$(SrcPath)\MyProject.SourceGenerators.Core\MyProject.SourceGenerators.Core.csproj" PrivateAssets="all" IncludeAssets="none" /> </ItemGroup> <ItemGroup> <None Include="$(OutputPath)\MyProject.SourceGenerators.dll" Pack="true" PackagePath="analyzers/dotnet/cs" Visible="false" /> <None Include="$(OutputPath)\MyProject.SourceGenerators.Core.dll" Pack="true" PackagePath="lib/netstandard2.0" /> </ItemGroup> </Project>
这样修改后,重新执行dotnet pack,引用MyGenerators包时就不会再触发NU1101错误了——NuGet只会处理MyGenerators本身,不会再尝试查找那两个不存在的独立包。
内容的提问来源于stack exchange,提问作者dopr

