我想发布一个源生成器包,并且我想包含对源生成器项目的私有项目依赖项。
例如,假设我的项目是A.SourceGenerator和A.CodeAnalysis.Core。我想A.SourceGenerator依赖A.CodeAnalysis.Core,但用ProjectReference代替PackageReference。
这意味着我希望在我的A.SourceGenerator.csproj文件中包含以下行或类似的内容:
<None Include="$(OutputPath)\A.CodeAnalysis.Core.dll" Pack="true" PackagePath="analyzers/dotnet/cs" Visible="false" />
Run Code Online (Sandbox Code Playgroud)
问题是,这个或一些类似的变体将不起作用,并且会在 CS8785 编译器警告下产生源生成错误,并显示以下错误消息:
生成器BenchmarkSourceGenerator无法生成源。它不会对输出产生影响,因此可能会出现编译错误。
异常类型FileNotFoundException为消息:
无法加载文件或程序集A.CodeAnalysis.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null或其依赖项之一。该系统找不到指定的文件。
显示上述错误是因为项目的内容需要本地复制到源生成器所在的目录上。使用时有一个技巧PackageReference,如此处所示,但它显然不适用于 的情况ProjectReference。
我宁愿避免创建源生成器所依赖的全新 NuGet 包,而只是为了包含依赖项。另一种解决方案是不将其抽象化,并且只有一个源生成器项目包括所有源生成器。
我一直在编写一个分析器并使用 .NET Standard 2.0,以便我可以针对 .NET Framework 4.7.2,我在 VSIX 版本的分析器中使用它。然而很快我就选择放弃它,因为支持它没有好处。从那时起,我就想将支持的框架升级到 .NET 5.0,以便在此过程中获得新的语言功能。
这会对通过发布的 NuGet 包将分析器包含到其项目中的最终用户产生什么影响?我还应该继续支持旧的框架版本吗?