Благодаря GitHub.com/Mono/T4 на данный момент вы можете сделать это для сборок .NET Core и Visual Studio, добавив это в свой .csproj
файл:
<ItemGroup>
<DotNetCliToolReference Include="dotnet-t4-project-tool" Version="2.0.5" />
<TextTemplate Include="**\*.tt" />
</ItemGroup>
<Target Name="TextTemplateTransform" BeforeTargets="BeforeBuild">
<ItemGroup>
<Compile Remove="**\*.cs" />
</ItemGroup>
<Exec WorkingDirectory="$(ProjectDir)" Command="dotnet t4 %(TextTemplate.Identity)" />
<ItemGroup>
<Compile Include="**\*.cs" />
</ItemGroup>
</Target>
Если вы преобразуете свои шаблоны в разные языки программирования, вы должны добавить что-то вроде <Compile Remove="**\*.vb" />
и <Compile Include="**\*.vb" />
для того, чтобы эти файлы были скомпилированы, даже если у вас еще нет сгенерированных файлов.
Remove
и Include
трюк нужен только для первого поколения, или вы можете сделать XML-короче так:
<ItemGroup>
<DotNetCliToolReference Include="dotnet-t4-project-tool" Version="2.0.5" />
<TextTemplate Include="**\*.tt" />
</ItemGroup>
<Target Name="TextTemplateTransform" BeforeTargets="BeforeBuild">
<Exec WorkingDirectory="$(ProjectDir)" Command="dotnet t4 %(TextTemplate.Identity)" />
</Target>
и просто запустите сборку дважды (в первый раз). Если вы уже сгенерировали файлы, зафиксированные в репозитории, проблем с перекомпиляцией в обоих примерах не возникнет.
В Visual Studio вы можете захотеть увидеть что-то вроде этого:
вместо этого:
Так что добавьте что-то подобное в ваш файл проекта:
<ItemGroup>
<Compile Update="UInt16Class.cs">
<DependentUpon>UInt16Class.tt</DependentUpon>
</Compile>
<Compile Update="UInt32Class.cs">
<DependentUpon>UInt32Class.tt</DependentUpon>
</Compile>
<Compile Update="UInt64Class.cs">
<DependentUpon>UInt64Class.tt</DependentUpon>
</Compile>
<Compile Update="UInt8Class.cs">
<DependentUpon>UInt8Class.tt</DependentUpon>
</Compile>
</ItemGroup>
Полный пример здесь: GitHub.com/Konard/T4GenericsExample (включает в себя создание нескольких файлов из одного шаблона).