學習Source Generators之輸出生成的文件

上一篇文章學習了通過獲取和解析swagger.json的內容,來生成API的請求響應類。
但是其中無法移動與編輯。
那麼本文將介紹如何輸出生成的文件。

EmitCompilerGeneratedFiles

在控制檯程序中,的PropertyGroup添加true
再次編譯,文件將會輸出到obj/Debug/net8.0/generated/GenerateClassFromSwagger.Analysis/GenerateClassFromSwagger.Analysis.ClassFromSwaggerGenerator目錄下。
打開目錄我們可以看到如下文件:
image.png

指定生成目錄

前面生成的文件在obj目錄下,多少有一些不方便,那麼如何指定輸出目錄呢。
可以通過添加CompilerGeneratedFilesOutputPath到PropertyGroup中來指定我們的輸出目錄。
如這裏配置輸出目錄爲SwaggerEntities:

<PropertyGroup>
  <OutputType>Exe</OutputType>
  <TargetFramework>net8.0</TargetFramework>
  <ImplicitUsings>enable</ImplicitUsings>
  <Nullable>enable</Nullable>
  <EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles>
  <CompilerGeneratedFilesOutputPath>SwaggerEntities</CompilerGeneratedFilesOutputPath>
</PropertyGroup>

再次編譯項目,可以看到文件輸出在我們的項目內。
image.png
此時打開文件也是可編輯的狀態。
image.png

動態目錄

除了上面的方法,還可以通過一些環境變量來指定文件輸出的目錄。

	<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。
image.png
利用這一點我們可以靈活的輸出我們的代碼文件。

缺點

通過這種方式也有一個缺點,就是我們只能編譯一次成功。第二次則會出現報錯提示。
image.png
所以這種方式適合需要修改輸出文件和並且把文件移動到別的位置的情況。

結語

本文介紹了Source Generators生成和輸出文件的方式。利用這些功能,我們可以靈活選擇是否需要輸出代碼文件到我們的項目中。

本文代碼倉庫地址https://github.com/fanslead/Learn-SourceGenerator

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章