如何在构建时在 Blazor 项目中运行 T4 模板

Posted

技术标签:

【中文标题】如何在构建时在 Blazor 项目中运行 T4 模板【英文标题】:How to run T4 template in Blazor project on build 【发布时间】:2020-12-15 19:30:54 【问题描述】:

我有一个 Blazor 项目,其中包含我编写的 T4 模板,用于自动构建一些代码。它在 Visual Studio 中运行良好,但我必须修改并保存模板才能使其再次运行(如记录和预期的那样)。

我也想在构建项目的时候运行模板,所以不用VS运行模板,必须是MSBuild。我浏览了一堆关于该主题的文章,看来我必须重新导入默认目标 as explained here。

我在 .csproj 文件的顶部添加了以下内容,这就是事情的进展:

<Import Project="Sdk.targets" Sdk="Microsoft.NET.Sdk.Web" />

这是我得到的错误:

无法识别 TargetFramework 值“netstandard2.1”。有可能 拼写错误。如果不是,则 TargetFrameworkIdentifier 和/或 必须指定 TargetFrameworkVersion 属性 明确地。测试项目 C:\Program Files\dotnet\sdk\3.1.401\Sdks\Microsoft.NET.Sdk\targets\Microsoft.NET.TargetFrameworkInference.targets 93

完整的 .csproj 文件:

<Project Sdk="Microsoft.NET.Sdk.Web">

    <Import Project="Sdk.targets" Sdk="Microsoft.NET.Sdk.Web" />
    
    <PropertyGroup>
        <TargetFramework>netstandard2.1</TargetFramework>
        <RazorLangVersion>3.0</RazorLangVersion>
    </PropertyGroup>

    <ItemGroup>
        <PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="3.2.1" />
        <PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.Build" Version="3.2.1" PrivateAssets="all" />
        <PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" Version="3.2.1" PrivateAssets="all" />
        <PackageReference Include="System.Net.Http.Json" Version="3.2.0" />
    </ItemGroup>

</Project>

我错过了什么/做错了什么?

【问题讨论】:

【参考方案1】:

您应该注意文章中的信息:

幸运的是,有一个解决方法:您可以导入默认目标 显式文件,然后导入文本模板目标:

解决方案

您应该在netstandard 2.1 节点之后导入这些目标。

在我这一边,我使用这些:

<Project Sdk="Microsoft.NET.Sdk.Web">
        
           <PropertyGroup>
               <TargetFramework>netstandard2.1</TargetFramework>
               <RazorLangVersion>3.0</RazorLangVersion>
           </PropertyGroup>
       
       
         <Import Project="Sdk.targets" Sdk="Microsoft.NET.Sdk.Web" />
         <Import Project="$(VSToolsPath)\TextTemplating\Microsoft.TextTemplating.targets"/>
       
           <ItemGroup>
               <PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="3.2.1"/>
               <PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.Build"
   Version="3.2.1" PrivateAssets="all" />
               <PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer"
   Version="3.2.1" PrivateAssets="all" />
               <PackageReference Include="System.Net.Http.Json" Version="3.2.0"/>
           </ItemGroup>
       
 </Project>

那么

【讨论】:

哦,是的!做到了。我没有意识到必须首先指定 TargetFramework 元素。回想起来是有道理的,但我对 MSBuild 知之甚少。现在有什么理由为什么您的示例有 Microsoft.NET.Sdk 而不是 Microsoft.NET.Sdk.Web? 哦,哈哈,是我搞错了。应该是&lt;Import Project="Sdk.targets" Sdk="Microsoft.NET.Sdk.Web" /&gt;。我已经更新了我的答案,你可以检查一下。

以上是关于如何在构建时在 Blazor 项目中运行 T4 模板的主要内容,如果未能解决你的问题,请参考以下文章

在 XCode 5 中构建时在 XCode 项目中运行 bash 文件

Blazor 项目在本地构建,但不在 azure 管道中

构建时 T4 转换的产品仅在下一个构建中使用

在构建服务器上运行 TextTransform.exe (T4)

让 Visual Studio 在每次构建时运行 T4 模板

在 blazor 中使用自定义组件时在注入的差异服务中调用 HttpContextAccesor 后为 null