使用T4 template
执行Cake build
的API /语法是什么?任何示例代码都将有所帮助。
是否应使用StartProcess API来调用texttransform.exe
,还是有其他可用的API。
[Cake]中有两个内置别名可用于处理T4 templates,TransformTemplate(ICakeContext, FilePath)和TransformTemplate(ICakeContext, FilePath, TextTransformSettings)
示例用法:
#tool "nuget:?package=Mono.TextTransform&version=1.0.0"
Task("TransformTemplate")
.Does(() => {
var templateFile = File("./Template.tt");
TransformTemplate(templateFile);
});
RunTarget("TransformTemplate");
使用的示例模板
Template generated <#=DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss")#>
示例模板结果
Template generated 2020-02-12 11:19:08
如果安装了.NET Core,建议您使用dotnet-t4全局工具,因为它维护得更好。
使用dotnet-t4全局工具的示例脚本脚本(Cake工具的分辨率会根据首先找到的位置自动使用t4.exe或texttransform.exe,就像使用任何工具一样,您都可以覆盖ToolSettings使用的工具[ C0]属性,在这种情况下为ToolPath
TextTransformSettings
示例#module nuget:?package=Cake.DotNetTool.Module&version=0.4.0
#tool "dotnet:?package=dotnet-t4&version=2.0.5"
Task("TransformTemplate")
.Does(() => {
var templateFile = File("./HelloWorld.tt");
var targetFile = File("./HelloWorld.txt");
var settings = new TextTransformSettings {
OutputFile = targetFile,
Properties = {
["FirstName"] = "John",
["LastName"] = "Doe"
}
};
TransformTemplate(templateFile, settings);
});
RunTarget("TransformTemplate");
HelloWorld.tt
示例结果<#@ parameter name='FirstName' #>
<#@ parameter name='LastName' #>
Hello <#=FirstName#> <#=LastName#>!
HelloWorld.txt
要使用Hello John Doe!
,我们需要atm引导程序,以便从NuGet中获取模块(在Cake 1.0中是不需要的,示例执行)
Cake.DotNetTool.Module
如下面在使用指令处理器的示例中所要求的(注意:在Mono T4中已弃用,因此只能在VisualStudio版本的TextTransform.exe上完全使用),指令处理器当前未包装在dotnet cake .\t4.cake --bootstrap
dotnet cake .\t4.cake
中,但是我们可以进行排序就像通过TextTransformSettings ToolSettings属性的任何Cake工具一样。
DirectiveTemplate.tt
示例Cake脚本,我们在此处使用VSW定位Visual Studio版本的<#@template language="c#" hostspecific="true"#>
Hello <#= this.Host.ResolveParameterValue("", "", "greet") #>!
,使用Cake工具分辨率注册路径,并通过自定义参数传递指令参数。
TextTransform.exe
#tool "nuget:?package=vswhere&version=2.8.4"
Setup(setupContext =>{
DirectoryPath vsLatest = VSWhereLatest();
FilePath textTransformPath = vsLatest?.CombineWithFilePath("Common7/IDE/TextTransform.exe");
if (textTransformPath == null || !FileExists(textTransformPath))
{
throw new Exception("Failed to resolve TextTransform.exe path.");
}
setupContext.Tools.RegisterFile(textTransformPath);
});
Task("T4")
.Does(() => {
var settings = new TextTransformSettings {
ArgumentCustomization = args => args.AppendSwitchQuoted("-a", " ", "!!greet!John")
};
TransformTemplate("./DirectiveTemplate.tt", settings);
});
RunTarget("T4");
中的结果将是
DirectiveTemplate.txt