通过扫描当前项目的元数据,定义 Map.Json 和 *.txt 模板文件,使用 scriban 模板引擎,实时生成内容。局限性:只能扫描当前程序集的内容。
class
interface
struct
enum
method
property
attribute
//搜索 SourceGenerator.Template 包,安装最新版
<PackageReference Include="SourceGenerator.Template" Version="1.0.9" />
此时在项目的 依赖项-分析器 - [SourceGenerator.Template.Generators] 下面可以看到扫描出来的元数据信息
Error:报错信息
MetaJson:元数据序列化后的json字符串
TemplateInfo:生效的相关模板信息
Time:扫描出来的元数据类别以及耗时
2、定义模板。内部引入了 scriban https://github.com/scriban/scriban。
[
{
"Code": "ToProtoBuilder",
"Name": "Class To Proto 扩展",
"MainTemplate": "ToProto_Main.txt",
"Templates": [ "ToProto.txt" ],
"Enable": true,
"Order": 1
}
]
Code:唯一值不能重复
MainTemplate:模板入口,类似于 Program 的 Main。这里组织数据,做一些逻辑组装,比如过滤class,或者过滤包含某个tag的method或attribute等。
Templates:可以定义多个模板文件,这里定义了只在当前扩展范围内生效。
Enable:是否启用
Order:数字越大越晚执行
数据组装好后,调用 render 方法,生成代码
2、编写 scriban 模板,固定是.txt 文件。 具体见 项目中的 SourceGenerator.Consoles 示例项目:https://github.com/ad313/SourceGenerator.Template/tree/main/src/SourceGenerator.Console/tmp
scriban 模板语法参考:https://github.com/scriban/scriban/blob/master/doc/builtins.md
1、打包后的dll以 Sg.Templates.dll 结尾
2、项目根目录新建一个文件夹,名称为 Templates
3、把模板放入Templates,并且设置所有的模板为 "嵌入的资源"