T4 texttransform可以在命令行上传递参数吗?

时间:2015-10-28 17:48:50

标签: visual-studio-2013 visual-studio-2015 code-generation t4

我想在命令行上运行构建服务器上的t4 TextTransForm.exe实用程序。我知道命令行上没有DTE对象等。 但是对需要参数的模板执行简单转换也表明参数指令在命令行上不起作用。

  

C:\ util>“C:\ Program Files(x86)\ Common Files \ Microsoft Shared \ TextTemplating \ 12.0 \ TextTransform.exe”test.tt -a !! MyParameter!test   错误:初始化转换对象时生成错误。转换不会运行。抛出以下异常:   System.NullReferenceException:未将对象引用设置为对象的实例。      在Microsoft.VisualStudio.TextTemplating9edb37733d3e4e5f96a377656fe05b5c.GeneratedTextTransformation.Initialize()      在CallSite.Target(Closure,CallSite,Object)      在System.Dynamic.UpdateDelegates.UpdateAndExecuteVoid1 [T0](CallSite站点,T0 arg0)      在Microsoft.VisualStudio.TextTemplating.TransformationRunner.PerformTransformation()

这是我的test.tt模板:

<#@ template language="C#" hostspecific="true" #>
<#@ parameter name="MyParameter" type="System.String" #>
Parameter in expression block: <#= MyParameter #>
Parameter in statement block: <# Write(MyParameter); #>

看待像这样的讨论 Get argument value from TextTransform.exe into the template给我的印象是,如果没有安装特定主机或Visual Studio,它也可以在命令行上运行。

我做错了什么,或者这只是在命令行上不起作用?

2 个答案:

答案 0 :(得分:1)

参数指令是导致错误的行。只需删除它,你就可以读取参数的值: this.Host.ResolveParameterValue( “”, “”, “MyParameter”);

所以工作的.tt看起来像这样:

<#@ template language="C#" hostspecific="true" #>
<#@ import namespace="Microsoft.VisualStudio.TextTemplating" #>


Parameter value is
<# 
var MyParameter= this.Host.ResolveParameterValue("","","MyParameter"); 
Console.WriteLine("MyParameter is: " + MyParameter);
#>

答案 1 :(得分:0)

hkstr的答案几乎是正确的,但在Visual Studio中使用时,“Host.ResolveParameterValue()”调用失败。答案是将呼叫包裹在try ... catch或检查DTE。就我而言,DTE拥有我想要的信息:

<#@ template debug="false" hostspecific="true" language="C#" #>
<#@ assembly name="System.Core" #>
<#@ assembly name="EnvDTE" #>
<#@ import namespace="EnvDTE" #>
<#
string activeConfiguration = null;          

// The IServiceProvider is available in VS but isn't available on the command line.
IServiceProvider serviceProvider = Host as IServiceProvider;
if (serviceProvider != null)
{
    DTE dte = (DTE)serviceProvider.GetService(typeof(DTE)); 
    activeConfiguration = dte.Solution.SolutionBuild.ActiveConfiguration.Name; 
}
else
{
    activeConfiguration = this.Host.ResolveParameterValue("", "", "ActiveConfiguration");
}
Console.WriteLine("ActiveConfiguration is: " + activeConfiguration);
#>