Как выполнить шаблон t4, используя скрипт Cake - PullRequest
2 голосов
/ 12 февраля 2020

Что такое API / синтаксис для выполнения T4 template с использованием Cake build? Любой пример кода будет полезен.

Должен ли StartProcess API использоваться для вызова texttransform.exe или есть какие-либо другие доступные API.

1 Ответ

4 голосов
/ 12 февраля 2020

Есть два встроенных псевдонима для работы с шаблонами T4 в Cake, 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 После установки рекомендуется использовать глобальный инструмент do tnet -t4 , так как он более ухоженный.

Пример скрипта для торта с использованием do tnet -t4 глобальный инструмент (разрешение инструмента Cake найдет использование 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 нам нужно bootstrap чтобы модуль выбирался из NuGet (не требуется в Cake 1.0), пример выполнения

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

Как указано в примере ниже, с использованием процессора директив (Примечание: в моно T4 это не рекомендуется, поэтому будет полностью работать только с версией VisualStudio TextTransform.exe), процессоры директив в настоящее время не заключены в TextTransformSettings , но мы можем отсортировать его, как любой инструмент Cake, с помощью ToolSettings ArgumentCustomization свойство.

Пример шаблона DirectiveTemplate.tt

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

Пример сценария 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");

Результат в DirectiveTemplate.txt будет

Hello John!
...