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

Deploying a C# source generator project that includes references to other private projects

我想发布一个源代码生成器包,我想在源代码生成器项目上包含一个私有项目依赖项。

例如,假设我的项目是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" />

问题是这个或一些类似的变体将不起作用,并且会在 CS8785 编译器警告下产生源代码生成错误,并显示以下错误消息:

生成器BenchmarkSourceGenerator 未能生成源。它不会影响输出,因此可能会出现编译错误。

异常类型为 FileNotFoundException,消息为:

无法加载文件或程序集 A.CodeAnalysis.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null 或其依赖项之一。系统找不到指定的文件。

出现上述错误是因为需要将工程内容复制到源码生成器所在目录下。使用 PackageReference 时有一个技巧,如 here 所示,但它显然不适用于 ProjectReference.

的情况

我宁愿避免创建源代码生成器所依赖的全新 NuGet 包,只是为了包含依赖项。另一种解决方案是不将其抽象化,只有一个源代码生成器项目包括所有源代码生成器。

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

<ProjectReference Include="..\OtherProject.csproj" OutputItemType="Analyzer" />

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

更新:

有人向我解释了这一点,我希望我能做对:

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

所以你添加 PackagePath="analyzers/dotnet/cs" 来打包你的包依赖和你的 Analyzer/SG。
为了让你的项目依赖打包到正确的路径,你可以添加 OutputItemType="Analyzer" 即使它们可能不是分析器。