如何调试Source Generator并正确使用NuGet包?
Source Generator引入Newtonsoft.Json后构建报错的解决方案
问题核心
你的Source Generator作为Roslyn组件,在构建Test项目时,Roslyn加载生成器程序集无法找到Newtonsoft.Json依赖。虽然打包时已将该DLL放入analyzers目录,但直接引用Generator项目构建时,依赖未被正确复制到生成器输出目录;同时NuGet包的依赖声明或打包方式存在缺失。
具体修复配置
1. 确保构建时将依赖复制到生成器输出目录
在Generator项目的.csproj中添加自定义目标,将Newtonsoft.Json.dll复制到输出目录,这样Test项目直接引用Generator项目时,Roslyn能找到依赖:
<Target Name="CopyDependencyToOutput" AfterTargets="Build"> <Copy SourceFiles="$(PkgNewtonsoft_Json)\lib\netstandard2.0\Newtonsoft.Json.dll" DestinationFolder="$(OutputPath)" SkipUnchangedFiles="true" /> </Target>
2. 调整NuGet打包的依赖项声明
将原本的<None>项替换为<AnalyzerDependency>,明确告诉Roslyn该DLL是生成器的依赖组件,打包和加载时会被正确识别:
<ItemGroup> <PackageReference Include="Newtonsoft.Json" Version="13.0.1" PrivateAssets="all" GeneratePathProperty="true" /> <None Include="$(OutputPath)\$(AssemblyName).dll" Pack="true" PackagePath="analyzers/dotnet/cs" Visible="false" /> <!-- 替换原None项为AnalyzerDependency --> <AnalyzerDependency Include="$(PkgNewtonsoft_Json)\lib\netstandard2.0\Newtonsoft.Json.dll" Pack="true" PackagePath="analyzers/dotnet/cs" /> </ItemGroup>
3. 补充NuGet包的依赖元数据(可选)
如果希望其他项目安装你的NuGet包时自动依赖Newtonsoft.Json,可以修改PrivateAssets配置,让NuGet自动在包的依赖中添加该组件:
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" PrivateAssets="analyzers;build" GeneratePathProperty="true" />
注:若已将Newtonsoft.Json打包到analyzers目录,此步骤可省略,避免重复依赖。
验证步骤
- 清理Generator项目和Test项目的构建输出目录
- 重新构建Generator项目,检查输出目录是否包含Newtonsoft.Json.dll
- 构建Test项目,确认不再出现找不到程序集的错误
- 打包Generator项目,安装到Test项目中测试,确保依赖正常加载
内容的提问来源于stack exchange,提问作者Peter
相关产品推荐
相关产品推荐

