C#源代码生成器在生成之前删除文件



我正在使用一个源生成器,该生成器生成我希望其他开发人员使用的实用程序类。我让发电机运转良好。我的问题是将文件发送到磁盘。我可以通过将文件发送到磁盘

<PropertyGroup>
<!--Persist the source generator (and other) files to disk--> 
<EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles>
<!--👇 The "base" path for the source generators--> 
<GeneratedFolder>Generated</GeneratedFolder>
<!--👇 Write the output for each target framework to a different sub-folder--> 
<CompilerGeneratedFilesOutputPath>$(GeneratedFolder)$(TargetFramework)</CompilerGeneratedFilesOutputPath>
</PropertyGroup>

上面的效果很好。但是,您不能再次运行生成器b/c,因为类型已经定义。

一个简单的解决方法是从编译中删除生成的类型。这是不可取的,因为开发人员会失去智能。

下一个选项是在预构建期间删除生成的目录。

<Target Name="CleanSourceGeneratedFiles" BeforeTargets="BeforeBuild" DependsOnTargets="$(BeforeBuildDependsOn)">
<RemoveDir Directories="Generated" />
</Target>

这确实有效,除了其他所有构建由于缺少文件而失败之外。

由于符号已加载,因此无法在源生成器期间删除生成的文件并重新生成它们。

如何创建一个将文件发送到磁盘并为开发人员提供智能的源代码生成器?

您可以告诉编译器忽略它,而不是删除包含生成文件的文件夹:

<PropertyGroup>
<EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles>
<CompilerGeneratedFilesOutputPath>Generated</CompilerGeneratedFilesOutputPath>
</PropertyGroup>
...
<ItemGroup>
<ProjectReference Include="..PathToMyGenerator.csproj" OutputItemType="Analyzer" ReferenceOutputAssembly="false" />
<Compile Remove="$(CompilerGeneratedFilesOutputPath)/**/*.cs" />
</ItemGroup>

这种方法还允许在源代码管理中保存生成的代码。此外,我非常确信IntelliSense在任何方面都不依赖于这些文件;它只查看内存中生成的代码。

最新更新