Есть два встроенных псевдонима для работы с шаблонами 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!