部署包含对其他私有项目的引用的 C# 源生成器项目

Rek*_*kon 4 c# project sourcegenerators

我想发布一个源生成器包,并且我想包含对源生成器项目的私有项目依赖项。

例如,假设我的项目是A.SourceGeneratorA.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 包,而只是为了包含依赖项。另一种解决方案是不将其抽象化,并且只有一个源生成器项目包括所有源生成器。

Pat*_*nio 5

我对项目文件了解不多,但至少我可以分享我的项目文件的一些内容。
我不得不参考这样的其他项目:

<ProjectReference Include="..\OtherProject.csproj" OutputItemType="Analyzer" />
Run Code Online (Sandbox Code Playgroud)

我不记得在哪里找到这个,但我希望它有帮助。

更新

我有人向我解释了这一点,我希望我能解释清楚:

基本上,为了不干扰包的其余部分,OutputItemType="Analyzer"导致 C# 分析器和 SG 打包在analyzers/dotnet/cs.
但在那里它将无法找到它的正常依赖项。

因此,您需要将PackagePath="analyzers/dotnet/cs"软件包依赖项与分析器/SG 一起打包。
为了将项目依赖项打包到正确的路径,您可以添加OutputItemType="Analyzer"即使它们可能不是分析器。

  • 不...它在两个地方都有效...为什么?我不知道,我只知道它确实如此 (2认同)