我希望在构建自动设计.d.ts期间为所有C# DTO创建TypeLite文件。我的Contract.tt在安装TypeLite Nuget包时稍微缩小了原始文件:
<#@ 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过程中添加了以下代码:
<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" />但不幸的是,我发现了这个错误:
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编译的方法?
发布于 2015-01-14 09:46:32
问题在Manager.ttinclude中,它负责将T4输出分割成多个文件并自动添加到项目中。这就要求DTE不是Visual的建模中的Visual的建模目标的一部分。
所以我刚刚删除了manager并创建了两个单独的模板。我没有得到Contract.tt,而是:
Enums.tt
<#@ 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
<#@ 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) #>https://stackoverflow.com/questions/27927359
复制相似问题