【问题标题】:How to execute t4 template using the Cake script如何使用 Cake 脚本执行 t4 模板
【发布时间】:2020-02-12 10:30:43
【问题描述】:

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

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

【问题讨论】:

    标签: c# continuous-integration t4 cakebuild


    【解决方案1】:

    有两个内置别名用于在 Cake 中使用 T4 templatesTransformTemplate(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 全局工具的示例蛋糕脚本(蛋糕工具解析将根据它首先找到的自动查找使用 t4.exe 或 texttransform.exe,与任何工具一样,您可以覆盖 ToolSettings 使用的工具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!
    

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

    dotnet cake .\t4.cake --bootstrap 
    dotnet cake .\t4.cake
    

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

    示例模板DirectiveTemplate.tt

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

    示例 Cake 脚本,我们在其中使用 VSWhere 定位 TextTransform.exe 的 VisualStudio 版本,使用 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");
    

    DirectiveTemplate.txt 中的结果将是

    Hello John!
    

    【讨论】:

    • 感谢您的回答。我会检查它是否符合我的要求。
    • 好的!如果它回答了您的问题,请标记为已回答;如果它没有提供您正在寻找的内容,请使用更多上下文更新问题。
    • 如果提供一个关于如何将参数传递给 tt 文件的附加示例将会很有帮助。
    • 嗯,HelloWorld.tt 模板有参数或者你在想别的东西。
    • 考虑第一个示例 Template.tt ,我想将参数应用于此模板。考虑这个例子:texttransform.exe "Template1.tt" -a "!!foo1!bar1" -a "!!foo2!bar2"。我想在蛋糕制作中实现这一目标。
    猜你喜欢
    • 2012-03-02
    • 2018-08-15
    • 1970-01-01
    • 2011-04-07
    • 1970-01-01
    • 2022-08-04
    • 1970-01-01
    • 2021-09-23
    • 2016-11-01
    相关资源
    最近更新 更多