上一篇文章學習了通過獲取和解析swagger.json的內容,來生成API的請求響應類。
但是其中無法移動與編輯。
那麼本文將介紹如何輸出生成的文件。
EmitCompilerGeneratedFiles
在控制檯程序中,的PropertyGroup添加
再次編譯,文件將會輸出到obj/Debug/net8.0/generated/GenerateClassFromSwagger.Analysis/GenerateClassFromSwagger.Analysis.ClassFromSwaggerGenerator目錄下。
打開目錄我們可以看到如下文件:
指定生成目錄
前面生成的文件在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>
再次編譯項目,可以看到文件輸出在我們的項目內。
此時打開文件也是可編輯的狀態。
動態目錄
除了上面的方法,還可以通過一些環境變量來指定文件輸出的目錄。
<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>
比如我們添加
$(GeneratedFolder)$(TargetFramework),那麼我們的輸出目錄將變成Generated\net8.0。
利用這一點我們可以靈活的輸出我們的代碼文件。
缺點
通過這種方式也有一個缺點,就是我們只能編譯一次成功。第二次則會出現報錯提示。
所以這種方式適合需要修改輸出文件和並且把文件移動到別的位置的情況。
結語
本文介紹了Source Generators生成和輸出文件的方式。利用這些功能,我們可以靈活選擇是否需要輸出代碼文件到我們的項目中。
本文代碼倉庫地址https://github.com/fanslead/Learn-SourceGenerator