首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在TypeLite T4模板中编译MSBuild

如何在TypeLite T4模板中编译MSBuild
EN

Stack Overflow用户
提问于 2015-01-13 16:54:43
回答 1查看 3.7K关注 0票数 4

我希望在构建自动设计.d.ts期间为所有C# DTO创建TypeLite文件。我的Contract.tt在安装TypeLite Nuget包时稍微缩小了原始文件:

代码语言:javascript
复制
    <#@ template debug="true" hostspecific="True" language="C#" #> 
    <#@ assembly name="TypeLite.dll" #>
    <#@ assembly name="TypeLite.Net4.dll" #>
    <#@ assembly name="My.Contract.dll" #>

    <#@ import namespace="TypeLite" #> 
    <#@ import namespace="TypeLite.Net4" #> 
    <#@output extension=".d.ts"#>

    <#@include file="Manager.ttinclude"#>
    <#
    var manager = Manager.Create(Host, GenerationEnvironment);
    var ts = TypeScript.Definitions()
        .WithReference("Enums.ts")
        .ForLoadedAssemblies();
    #>
    <#= ts.Generate(TsGeneratorOutput.Properties) #>

    <# manager.StartNewFile("Enums.ts"); #>
    <#= ts.Generate(TsGeneratorOutput.Enums) #>
    <# manager.EndBlock(); #>
    <# manager.Process(true); #>

小姐指南这篇文章之后,我在MSbuild过程中添加了以下代码:

代码语言:javascript
复制
<PropertyGroup>
  <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">12.0</VisualStudioVersion>
  <VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
  <TransformOnBuild>true</TransformOnBuild>
</PropertyGroup>
<ItemGroup>
  <T4ReferencePath Include="$(SolutionDir)\My.Contract\bin\$(Configuration)">
    <InProject>False</InProject>
  </T4ReferencePath>

  <None Include="$(SolutionDir)\Scripts\Contract.tt">
    <Generator>TextTemplatingFileGenerator</Generator>
    <OutputFilePath>$(SolutionDir)\Scripts</OutputFilePath>
  </None>
</ItemGroup>

<Import Project="$(VSToolsPath)\TextTemplating\Microsoft.TextTemplating.targets" />

但不幸的是,我发现了这个错误:

代码语言:javascript
复制
Error   14  Running transformation: System.ArgumentNullException: Value cannot be null.
Parameter name: Could not obtain DTE from host
   at Microsoft.VisualStudio.TextTemplating<cut>.GeneratedTextTransformation.Manager.VSManager..ctor

看起来,T4模板只能在VisualStudio中执行。是否有一种使用TypeLite运行MSBuild编译的方法?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-14 09:46:32

问题在Manager.ttinclude中,它负责将T4输出分割成多个文件并自动添加到项目中。这就要求DTE不是Visual的建模中的Visual的建模目标的一部分。

所以我刚刚删除了manager并创建了两个单独的模板。我没有得到Contract.tt,而是:

Enums.tt

代码语言:javascript
复制
    <#@ template debug="false" hostspecific="True" language="C#" #>
    <#@ assembly name="TypeLite.dll" #>
    <#@ assembly name="TypeLite.Net4.dll" #>
    <#@ assembly name="CC.Business.Contract.dll" #>

    <#@ import namespace="TypeLite" #> 
    <#@ import namespace="TypeLite.Net4" #> 
    <#@output extension=".ts"#>

    <#
        var ts = TypeScript.Definitions()
            .ForLoadedAssemblies();
    #>
    <#= ts.Generate(TsGeneratorOutput.Enums) #>

Models.tts

代码语言:javascript
复制
    <#@ template debug="false" hostspecific="True" language="C#" #>
    <#@ assembly name="TypeLite.dll" #>
    <#@ assembly name="TypeLite.Net4.dll" #>
    <#@ assembly name="CC.Business.Contract.dll" #>

    <#@ import namespace="TypeLite" #> 
    <#@ import namespace="TypeLite.Net4" #> 
    <#@output extension=".d.ts"#>

    <#
        var ts = TypeScript.Definitions()
            .WithReference("Enums.ts")
            .ForLoadedAssemblies();
    #>
    <#= ts.Generate(TsGeneratorOutput.Properties) #>
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27927359

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档