我使用 .NET6 以来提供的 IIncrementalGenerator 接口创建了一个源生成器。当我在本地运行构建时,一切正常并且生成了我的文件。即使在运行本地 powershell 实例并运行 n
dotnet build
时,一切都会按预期运行。然而,一旦我将源生成器放入 PR 中,并配置了作为 PR 运行的构建管道,检查就会失败。从错误消息(例如“命名空间 XY 不存在于 ....”等)来看,源生成器似乎没有生成这些文件,因此导致了错误。
现在我在网上找到了一个已有三年历史的修复程序,它对我有用。解决方法是我在 csproj 文件中添加了以下代码行,其中我还引用了我的代码生成器。
<PackageReference Include="Microsoft.Net.Compilers.Toolset" Version="4.7.0" PrivateAssets="all">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
但是,该修复并不被认为是干净的,即使在它的 nuget 描述中,也提到您应该仅将其用作“修补程序”,而不是作为长期解决方案。
所以我需要找出如何以一种稳健的方式解决这个问题,这样它才能长期保持下去。由于我自己无法解决这个问题,所以我在这里发布这个问题。
我期待一种解决方案,它不会像上面的那样感觉很糟糕,并且能够保留在代码库中。此外,了解问题的实际情况会很酷。因为我读到的内容是某种编译器问题,但我没有设法找出不起作用的确切原因。
我想我应该添加一个我认为可能与该问题相关的警告。 (因为我不想将实际的项目结构和名称放在这里,所以我将在这里手动输入错误的缩写版本)
[警告]:分析器程序集../../X.dll引用编译器 版本 4.7.0.0 比当前运行的版本更新 4.4.0.0
在等待回复的过程中,我自己尝试找出问题几个小时后,我实际上成功了。
我想我应该将答案发布在这里,以便其他遇到与我相同问题的人可以从中受益。
现在,最终我要弄清楚为什么引用了比 azure 使用的编译器版本更新的编译器版本。 --> 因此,如果您遇到同样的问题,请查找我在上面的问题中发布的警告,如果您看到该警告,那么这个解决方案适合您。
我发现我正在导入以下包:
<PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="4.7.0" PrivateAssets="all" />
更改为
后<PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="4.0.0" PrivateAssets="all" />
一切顺利。
重要: 我没有在这里升级 azures 编译器版本,但如果您有权这样做,这也将是一个解决方案。