學習Source Generators之輸出生成的檔案

饭勺oO發表於2024-04-02

上一篇文章學習了透過獲取和解析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

相關文章