学习Source Generators之输出生成的文件

上一篇文章学习了通过获取和解析swagger.json的内容,来生成API的请求响应类。

但是其中无法移动与编辑。

那么本文将介绍如何输出生成的文件。

EmitCompilerGeneratedFiles

在控制台程序中,的PropertyGroup添加 true

再次编译,文件将会输出到obj/Debug/net8.0/generated/GenerateClassFromSwagger.Analysis/GenerateClassFromSwagger.Analysis.ClassFromSwaggerGenerator目录下。

打开目录我们可以看到如下文件:

指定生成目录

前面生成的文件在obj目录下,多少有一些不方便,那么如何指定输出目录呢。

可以通过添加CompilerGeneratedFilesOutputPath到PropertyGroup中来指定我们的输出目录。

如这里配置输出目录为SwaggerEntities:

xml 复制代码
<PropertyGroup>
  <OutputType>Exe</OutputType>
  <TargetFramework>net8.0</TargetFramework>
  <ImplicitUsings>enable</ImplicitUsings>
  <Nullable>enable</Nullable>
  <EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles>
  <CompilerGeneratedFilesOutputPath>SwaggerEntities</CompilerGeneratedFilesOutputPath>
</PropertyGroup>

再次编译项目,可以看到文件输出在我们的项目内。

此时打开文件也是可编辑的状态。

动态目录

除了上面的方法,还可以通过一些环境变量来指定文件输出的目录。

xml 复制代码
	<PropertyGroup>
		<OutputType>Exe</OutputType>
		<TargetFramework>net8.0</TargetFramework>
		<ImplicitUsings>enable</ImplicitUsings>
		<Nullable>enable</Nullable>
		<EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles>
		<GeneratedFolder>Generated</GeneratedFolder>
		<CompilerGeneratedFilesOutputPath>$(GeneratedFolder)\$(TargetFramework)</CompilerGeneratedFilesOutputPath>
	</PropertyGroup>

比如我们添加 Generated 到PropertyGroup中,CompilerGeneratedFilesOutputPath的内容改成

(GeneratedFolder)(TargetFramework),那么我们的输出目录将变成Generated\net8.0。

利用这一点我们可以灵活的输出我们的代码文件。

缺点

通过这种方式也有一个缺点,就是我们只能编译一次成功。第二次则会出现报错提示。

所以这种方式适合需要修改输出文件和并且把文件移动到别的位置的情况。

结语

本文介绍了Source Generators生成和输出文件的方式。利用这些功能,我们可以灵活选择是否需要输出代码文件到我们的项目中。

本文代码仓库地址https://github.com/fanslead/Learn-SourceGenerator

相关推荐
yong999015 小时前
C# 实时查看硬件使用率(CPU 内存 硬盘 网络)
开发语言·网络·c#
神仙别闹17 小时前
基于 C# OpenPGP 的文件管理系统
开发语言·c#
海盗123419 小时前
C#在Distinct()中使用IEqualityComparer<T>
开发语言·c#
呼Lu噜21 小时前
基于C#的ASP.NET Core中分析async、await的使用场景
数据库·c#·asp.net
等故意1 天前
C# 工业视觉上位机开发心得分享
开发语言·数码相机·c#·视觉检测
时光追逐者1 天前
C#/.NET/.NET Core技术前沿周刊 | 第 70 期(2026年5.01-5.10)
c#·.net·.netcore
莫生灬灬1 天前
ElementUI封装 共91个组件 支持易语言/火山/C#/Python
开发语言·c++·python·ui·elementui·c#
huaqianzkh1 天前
POCO = Plain Old CLR/CSharp Object
c#
gihigo19981 天前
C# 绘制直线 圆形 矩形(工业上位机)
开发语言·c#