部署包含对其他私有项目的引用的 C# 源代码生成器项目
Deploying a C# source generator project that includes references to other private projects
我想发布一个源代码生成器包,我想在源代码生成器项目上包含一个私有项目依赖项。
例如,假设我的项目是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" />
问题是这个或一些类似的变体将不起作用,并且会在 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"
即使它们可能不是分析器。
我想发布一个源代码生成器包,我想在源代码生成器项目上包含一个私有项目依赖项。
例如,假设我的项目是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" />
问题是这个或一些类似的变体将不起作用,并且会在 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"
即使它们可能不是分析器。