当我们需要生成模板输出工件时,我们如何用 Roslyn 替换 T4
Posted
技术标签:
【中文标题】当我们需要生成模板输出工件时,我们如何用 Roslyn 替换 T4【英文标题】:How can we replace T4 with Roslyn when we need to have template output artefacts generated 【发布时间】:2021-02-02 07:23:30 【问题描述】:我们有许多使用 T4 和有形多文件生成库编写的模板。
一个例子如下:-
C# 库中的一些实体对象从“BaseEntity”继承并具有“RequiresAudit”属性。
通过上述“BaseEntity”的继承和“RequiresAudit”的归属,在 T4 模板中定位和分析这些实体。
一旦分析,T4 会生成 3 个 SQL 触发器文件,由 DB 团队在旧工具中应用这些触发器文件,以及一个 JSON 格式的文档文件。
因此我们要求 T4 从模板运行中生成一些人工制品 - 3 个“Entity.SQL”文件和一个“docs.json”文件。
我们在 .NET 方面的所有新代码都将移至 .NET 5,这是我们的经理们现阶段准备进行的唯一一次大爆炸。
问题...
我们如何使用 Roslyn Analyzer 或 Generator 来完成完全相同的工作? 我们必须使项目中生成的文件可用。我们如何做到这一点? 任何人都可以举一个很好的例子吗? Roslyn 是否可以将项目中的文件作为嵌入式资源包含在内,如果可以,如何?
我们真的很想学习 Roslyn,但我们也害怕我们会浪费精力。
VS2019 预览版似乎缺乏对 T4 的支持(无论如何使用 .net 5 时),而且我还担心技术运动似乎正被罗斯林世界所吸引,并且 T4 可能即将结束生命.
我读过的所有关于 Roslyn 代码生成器的文档似乎都没有留下任何文件,而是简单地将一组功能编译到程序集中,而没有任何代码源文件的痕迹。我似乎找不到一个明显的方式从 T4 到 Roslyn,就像 t4 一样。
我不需要“你为什么要这样做?”厘米。我们不能改变太多。只是一种很好的友好方式(示例)来解决问题,而无需重写我们在旧系统中拥有的各种接触点。
【问题讨论】:
【参考方案1】:如果我仔细阅读您的场景,您生成的文件是 SQL 或 JSON;现在,任何由源生成器生成的文件都被假定为 C# 文件,并且隐式包含在编译中。我们尚不支持仅在您的情况下写出其他文件。从 16.8 预览版 4 开始,您现在可以设置一个属性,以便在实际编译步骤中也将 C# 文件写入目录,但它仍然只是 C# 文件。
这绝对是我们正在考虑的事情(源代码生成器设计团队上周确实举行了一次会议,开始考虑这个案例)但我们还没有完全致力于这个场景,我们也没有时间表我们可能会运送一些东西。
【讨论】:
嗨杰森。谢谢(你的)信息。我敢肯定,有很多团队面对这种情况,并按照 T4 所做的事情的本质走上了“生成的人工制品”路线。在我们的团队中,它不仅仅是 SQL 和 JSON,还有其他 T4 正在做很多其他生成。当然,我们所做的一些事情可以编译成一个类,但并非所有事情都是如此。真的很高兴你能注意到它,至少这给了我们一些希望,罗斯林将成为前进的道路,真的希望文件文物很快就会出现。我们会留意的。我们正在研究 VS Preview。 “从 16.8 预览版 4 开始,您现在可以设置一个属性,以将 C# 文件作为实际编译步骤的一部分写入目录,但它仍然只是 C# 文件。”什么是财产?您有示例项目的 URL 吗? github.com/dotnet/roslyn/pull/47047 是实现它的 PR。我不确定我们是否有示例,但您可以将 EmitCompilerGeneratedFiles 设置为 true 以启用它,并设置 CompilerGeneratedFilesOutputPath 如果您想更改它设置的路径。以上是关于当我们需要生成模板输出工件时,我们如何用 Roslyn 替换 T4的主要内容,如果未能解决你的问题,请参考以下文章
如何用 APT(Annotation Processing Tool)自动生成代码