如何避免C#源生成器项目被打包并上传到NuGet?
问题原因
默认配置下源生成器项目属于可打包项目,且主类库对它的项目引用会被识别为可传递依赖,执行打包操作时要么会将源生成器项目生成独立的nupkg文件,要么会将其标记为主类库包的依赖项,导致被一同上传到NuGet。
解决方法
只需修改两处配置即可解决:
1. 禁止源生成器项目生成NuGet包
在源生成器项目的.csproj文件的PropertyGroup节点中添加<IsPackable>false</IsPackable>配置,从根源避免该项目被打包为独立NuGet包。
修改后的源生成器项目配置示例:
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>netstandard2.0</TargetFramework> <LangVersion>9.0</LangVersion> <!-- 新增以下配置 --> <IsPackable>false</IsPackable> </PropertyGroup> <ItemGroup> <PackageReference Include="Microsoft.CodeAnalysis.CSharp.Workspaces" Version="3.8.0"/> <PackageReference Include="Microsoft.CodeAnalysis.Analyzers" Version="3.3.2"> <PrivateAssets>all</PrivateAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> </PackageReference> </ItemGroup> </Project>
2. 标记源生成器引用为私有依赖
在主类库的.csproj文件中,找到对源生成器项目的ProjectReference节点,添加PrivateAssets="all"属性,告知NuGet该依赖仅用于主项目构建,不会作为主包的公开依赖传递,避免关联拉取独立的源生成器包。
修改后的主类库引用配置示例:
<ItemGroup> <ProjectReference Include="..\MyLib.SourceGenerators\MyLib.SourceGenerators.csproj" OutputItemType="Analyzer" ReferenceOutputAssembly="false" <!-- 新增以下配置 --> PrivateAssets="all"/> </ItemGroup>
以上配置不会影响源生成器的正常功能,也不会阻止源生成器的dll被嵌入到主类库的NuGet包中随主包分发,符合常规源生成器类库的打包逻辑。
内容的提问来源于stack exchange,提问作者user16501294
相关产品推荐
相关产品推荐

