我正在尝试为项目创建自己的DSL,并且我想创建一个包含主要引擎的T4文件,然后创建包含此引擎的小T4文件并调用它。
我正在考虑为将调用引擎的T4文件尝试这种格式:
<#@ include file="EngineLib\EngineLib.tt" #>
<# RunEngine(); #>
dsl goes here
我提出的三个问题如下:
基本上,在EngineLib.tt中,我可以检索包含它的脚本的完整路径和文件名,在这种情况下,脚本如上所示?或者,如果没有,它的内容?
例如,在RunEngine()
方法中,如果第一个问题产生答案,我会读完原始脚本,删除包含T4指令的第一行,然后根据我的处理文件的其余部分DSL规则。
然后,当RunEngine
从该DSL产生代码结果时,我将终止T4代码的处理,因此DSL本身不会作为生成文件的一部分输出。
这有意义吗?
假设RunEngine只输出一个类,如果我无法终止处理,这就是生成的文件的样子:
public class SomeClass
{
}
dsl goes here
显然,我不想将DSL代码作为生成输出的一部分。
我知道我不能在DSL中包含类似T4的代码,因为这最终会被编译成代码,这些代码将作为T4处理的一部分运行,但在这种情况下它不会成为问题。
我还没有想到的其他任何事情都可能出错?
答案 0 :(得分:5)
要获取脚本的名称,请使用Host.TemplateFile
。要使主机可用,请将hostspecific
属性添加到标题:
<#@ template language="C#v3.5" hostspecific="true" debug="true" #>
要停止处理脚本,可以使用return
语句。显然,在另一个函数中没有办法做到这一点,你必须在<# #>
括号内进行。
<# return GenerationEnvironment.ToString(); #>
您尝试实现的目标通常是使用两个单独的文件:T4脚本和它用作源的数据文件。要在更改数据文件时更新生成的脚本文件,并从一个T4脚本生成多个文件,您可以使用T4Toolbox。