有没有办法从代码中以编程方式运行T4文本模板?我正在制作一个自定义域特定语言,我希望每次用户保存时都会运行相关的文本模板.目前,这就是我在DSL模型中所做的:
protected override void OnDocumentSaved(EventArgs e)
{
IVsCommandWindow commandWindow = (IVsCommandWindow)this.ServiceProvider.GetService(typeof(IVsCommandWindow));
if (commandWindow != null)
{
commandWindow.ExecuteCommand("TextTransformation.TransformAllTemplates");
}
base.OnDocumentSaved(e);
}
Run Code Online (Sandbox Code Playgroud)
这有效,但它有一个非常讨厌的副作用.如果项目有多个DSL文档,每个文档都有相关的文本模板,那么它们都将运行,而不仅仅是受给定DSL文档更改影响的文档.这可能看起来不是什么大问题,但它会导致源代码控制检出所有生成的文件,如果你有很多文档,那么转换实际上可能需要很长时间.谢谢你的帮助.
来自DSL团队的Jean-Mark Prieur解释了如何使用DSL Tools Lab第4部分中的自定义工具执行此操作.您也可以使用ITextTemplating服务直接从DSL模型执行此操作.更多关于模板转换如何在这里工作.