【问题标题】:How to run T4 template in Blazor project on build如何在构建时在 Blazor 项目中运行 T4 模板
【发布时间】: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>

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

【问题讨论】:

    标签: visual-studio .net-core msbuild blazor t4


    【解决方案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;。我已经更新了我的答案,你可以检查一下。
    猜你喜欢
    • 2011-01-19
    • 1970-01-01
    • 2010-12-11
    • 1970-01-01
    • 2015-01-28
    • 2011-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多