如何使用 Cake 脚本执行 t4 模板

Ven*_*kat 2 c# t4 continuous-integration cakebuild

T4 template使用来执行的 API/语法是什么Cake build?任何示例代码都会有所帮助。

是否应使用StartProcess API 来调用texttransform.exe或是否有任何其他可用的 API。

dev*_*ead 6

Cake 中有两个内置别名用于使用T4 模板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");
Run Code Online (Sandbox Code Playgroud)

使用的示例模板

Template generated <#=DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss")#>
Run Code Online (Sandbox Code Playgroud)

模板结果示例

Template generated 2020-02-12 11:19:08
Run Code Online (Sandbox Code Playgroud)

如果您安装了 .NET Core,建议您使用dotnet-t4全局工具,因为它维护得更好。

使用dotnet-t4全局工具的示例蛋糕脚本(蛋糕工具解析将自动使用 t4.exe 或 texttransform.exe,具体取决于它首先找到哪个工具,与任何工具一样,在这种情况下,您可以覆盖ToolSettings ToolPath属性使用的工具文本转换设置

#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");
Run Code Online (Sandbox Code Playgroud)

例子HelloWorld.tt

<#@ parameter name='FirstName' #>
<#@ parameter name='LastName' #>
Hello <#=FirstName#> <#=LastName#>!
Run Code Online (Sandbox Code Playgroud)

结果示例HelloWorld.txt

Hello John Doe!
Run Code Online (Sandbox Code Playgroud)

要使用Cake.DotNetTool.Module我们的 atm 需要引导,以便从 NuGet 获取模块(在 Cake 1.0 中不需要),示例执行

dotnet cake .\t4.cake --bootstrap 
dotnet cake .\t4.cake
Run Code Online (Sandbox Code Playgroud)

正如下面所要求的使用指令处理器的示例(注意:在 mono T4 中,这已被弃用,因此只能与 TextTransform.exe 的 VisualStudio 版本完全兼容),指令处理器当前未包装在TextTransformSettings中,但我们可以像任何 Cake 一样对它进行排序工具通过ToolSettings ArgumentCustomization属性。

示例模板DirectiveTemplate.tt

<#@template language="c#" hostspecific="true"#>
Hello <#= this.Host.ResolveParameterValue("", "", "greet") #>!
Run Code Online (Sandbox Code Playgroud)

示例 Cake 脚本,我们使用 VSWhere 来定位 VisualStudio 版本TextTransform.exe,使用 Cake 工具解析注册路径并通过参数自定义传递指令参数。

#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");
Run Code Online (Sandbox Code Playgroud)

结果DirectiveTemplate.txt将是

Hello John!
Run Code Online (Sandbox Code Playgroud)