gpt4 book ai didi

visual-studio-2017 - .Net Core 项目中的 TextTemplating 目标

转载 作者:行者123 更新时间:2023-12-03 23:57:56 26 4
gpt4 key购买 nike

我最近将一个测试项目迁移到 .NET Core 2.0。该测试项目使用文本模板生成一些重复代码。之前的项目有一个构建目标,用于在构建之前生成所有 T4 模板。因此,生成的代码也不会 checkin VCS。

我在项目中使用了这个片段来确保构建模板:

<PropertyGroup>
<!-- Default VisualStudioVersion to 15 (VS2017) -->
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">15.0</VisualStudioVersion>
<!-- Determinate VSToolsPath -->
<VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
<!-- Run T4 generation if there are outdated files -->
<TransformOnBuild>True</TransformOnBuild>
<TransformOutOfDateOnly>True</TransformOutOfDateOnly>
</PropertyGroup>
<!-- Import TextTemplating target -->
<Import Project="$(VSToolsPath)\TextTemplating\Microsoft.TextTemplating.targets" />

我的第一种方法是保留此片段并将其复制到新的 .NET Core 项目文件中。

在 Visual Studio 中,这很有效,因为很明显, VSToolsPath设置正确。但是,当我运行 .NET Core SDK 工具时,例如 dotnet test (就像我在构建服务器上所做的那样), VSToolsPath映射到 Program Files\dotnet\sdk\2.0.3在那里,找不到文本模板目标。

因为那不起作用,我也尝试简单地安装 Microsoft.VisualStudio.TextTemplating来自 Nuget 的包,但有两个问题:
  • 它不正式支持 .NET Core 并为 .NET 4.6.1 和
  • 安装
  • Nuget 似乎没有安装任何东西,所以我无法调整项目文件中的路径。
  • 最佳答案

    在构建时支持构建 T4 模板 dotnet build您需要使用 Custom Text Template Host ,对于 .NET Core ( https://github.com/atifaziz/t5 ) 已经存在。要包含它,请在任何 ItemGroup 中添加到您的项目中。这个元素:<DotNetCliToolReference Include="T5.TextTransform.Tool" Version="1.1.0-*" /> .
    由于 Visual Studio 已经拥有自己的 Text Template Host实现,您添加的元素应仅适用于 .NET Core。例如:

    <ItemGroup Condition="'$(MSBuildRuntimeType)'=='Core'">
    <DotNetCliToolReference Include="T5.TextTransform.Tool" Version="1.1.0-*" />
    </ItemGroup>

    同时,您应该在 .NET Core 之外设置 Visual Studio 文本模板主机的设置,如下所示: Condition="'$(MSBuildRuntimeType)'=='Full'" .

    您还应该添加 <Import Project="Sdk.targets" Sdk="Microsoft.NET.Sdk" Condition="'$(MSBuildRuntimeType)'=='Full'" />导入前 Microsoft.TextTemplating.targets使用 .NET Core csproj 使一切正常工作在 Visual Studio 中。

    如果您需要能够清理所有生成的代码,您应该将模板从 *.tt 重命名。至 *.Generated.tt ,所有代码都会在 *.Generated.cs下生成并且可以在 dotnet clean 处过滤掉这些文件行动。
    csproj 中的完整示例:

    <!-- T4 build support for .NET Core (Begin) -->

    <ItemGroup Condition="'$(MSBuildRuntimeType)'=='Core'">
    <DotNetCliToolReference Include="T5.TextTransform.Tool" Version="1.1.0-*" />
    <TextTemplate Include="**\*.Generated.tt" />
    <Generated Include="**\*.Generated.cs" />
    </ItemGroup>

    <Target Name="TextTemplateTransform" BeforeTargets="BeforeBuild" Condition="'$(MSBuildRuntimeType)'=='Core'">
    <ItemGroup>
    <Compile Remove="**\*.cs" />
    </ItemGroup>
    <Exec WorkingDirectory="$(ProjectDir)" Command="dotnet tt %(TextTemplate.Identity)" />
    <ItemGroup>
    <Compile Include="**\*.cs" />
    </ItemGroup>
    </Target>

    <Target Name="TextTemplateClean" AfterTargets="Clean">
    <Delete Files="@(Generated)" />
    </Target>

    <!-- T4 build support for .NET Core (End) -->


    <!-- T4 build support for Visual Studio (Begin) -->

    <PropertyGroup Condition="'$(MSBuildRuntimeType)'=='Full'">
    <VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
    <!-- This is what will cause the templates to be transformed when the project is built (default is false) -->
    <TransformOnBuild>true</TransformOnBuild>
    <!-- Set to true to force overwriting of read-only output files, e.g. if they're not checked out (default is false) -->
    <OverwriteReadOnlyOutputFiles>true</OverwriteReadOnlyOutputFiles>
    <!-- Set to false to transform files even if the output appears to be up-to-date (default is true) -->
    <TransformOutOfDateOnly>false</TransformOutOfDateOnly>
    </PropertyGroup>

    <Import Project="Sdk.targets" Sdk="Microsoft.NET.Sdk" Condition="'$(MSBuildRuntimeType)'=='Full'" />
    <Import Project="$(VSToolsPath)\TextTemplating\Microsoft.TextTemplating.targets" Condition="'$(MSBuildRuntimeType)'=='Full'" />

    <!-- T4 build support for Visual Studio (End) -->

    如果您不想重命名模板文件并且不需要清理它们,请替换:

      <TextTemplate Include="**\*.Generated.tt" />
    <Generated Include="**\*.Generated.cs" />

    和:

      <TextTemplate Include="**\*.tt" />

    并删除:

    <Target Name="TextTemplateClean" AfterTargets="Clean">
    <Delete Files="@(Generated)" />
    </Target>

    有关更多信息,请参阅:

    如何在 dotnet build 上设置代码生成:
    https://notquitepure.info/2018/12/12/T4-Templates-at-Build-Time-With-Dotnet-Core/

    如何在构建时为 Visual Studio 和 .NET Core 设置代码生成 csproj :
    https://thomaslevesque.com/2017/11/13/transform-t4-templates-as-part-of-the-build-and-pass-variables-from-the-project/

    从单个 T4 模板生成多个文件的完整示例:
    https://github.com/Konard/T4GenericsExample

    更新:

    GitHub.com/Mono/T4 is even better .

    关于visual-studio-2017 - .Net Core 项目中的 TextTemplating 目标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47691299/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com