如何在构建时在 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? 哦,哈哈,是我搞错了。应该是<Import Project="Sdk.targets" Sdk="Microsoft.NET.Sdk.Web" />
。我已经更新了我的答案,你可以检查一下。以上是关于如何在构建时在 Blazor 项目中运行 T4 模板的主要内容,如果未能解决你的问题,请参考以下文章
在 XCode 5 中构建时在 XCode 项目中运行 bash 文件
在构建服务器上运行 TextTransform.exe (T4)