T4模板不会随构建转换

我在Windows 7上使用VisualStudio Ultimate 2012(Update 1)。我可以通过以下方式获取我的T4模板生成文件: 右键单击[tt file] | 运行自定义工具 。 这很棒! (对我而言)。 如果我运行菜单命令,它也可以工作: Build | 转换所有T4模板 。 但我想要自动化! 当我尝试使用每个构建生成生成的代码文件时遇到问题 – 这是我的目标。
我看了一下: Visual Studio中的T4转换和构建顺序

这不是我想要的。 它讨论了使用预构建构建事件。 我希望它成为构建的一部分。

并且: 有没有办法让Visual Studio在成功构建时运行“转换所有模板”?

这不是我想要的。 它讨论了使用后构建事件。

然后我发现了这个: 了解T4:MSBuild集成

来自Oleg Sych的博客 :

完善! 这就是我要的。 虽然他的博客讨论了VS2010,但我已将其应用于VS2012(如适用)。

为了实现这一点,我完成了他的每个步骤。 我安装了Visual Studio SDK 2012和Visual Studio Visualization and Modeling SDK(2012)

我开始使用有形T4插件,但认为有问题,我使用了Oleg的T4工具箱测试版。 可悲的是,我似乎得到了相同的结果:构建错误。

我按照他在网站上的指示重新阅读了所有步骤和部分。 我已经研究了几天,现在是我的第一篇文章。 我被卡住了。 谢谢你的期待……

回顾一下:当我在visual studio 2012中构建或者从命令行运行msbuild时出现错误(但是当我运行自定义工具或使用手册转换所有T4模板时 – 这两种工作都很好)。

这是我的t4template,名为s_code.tt

                <# IServiceProvider serviceProvider = (IServiceProvider)Host; EnvDTE.DTE dte = (EnvDTE.DTE)serviceProvider.GetService(typeof(EnvDTE.DTE)); var configName = dte.Solution.SolutionBuild.ActiveConfiguration.Name; string filename = this.Host.ResolvePath("s_code_source.txt"); string[] lines = File.ReadAllLines(filename); bool isAccountFound = false; int linecount = lines.Length; int currentline = 0; for (int i=0;i<linecount;i++) { if (Contains_S_Account(lines[i])) { if (configName.ToUpper() == "DEBUG") { WriteLine("var s_account = \"macudev2\""); } else if (configName.ToUpper() == "RELEASE") { WriteLine("var s_account = \"macudev\""); } currentline = i; isAccountFound = true; } else { WriteLine(lines[i]); } } for (int i=currentline;i  

这是我的.csproj文件:

     Debug AnyCPU   2.0 {0A44E136-F4A4-4B31-95DD-2C8A79FDFAF4} {349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc} Library Properties Macu.Content Macu.Content v4.0 true      True $(MSBuildProjectDirectory)\Include   true full false bin\ DEBUG;TRACE prompt 4   pdbonly true bin\ TRACE prompt 4    True   True    True        True True s_code.tt          TextTemplatingFileGenerator s_code.js  <%3fxml version="1.0" encoding="utf-16"%3f> <ArrayOfParameterStorage xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" />     Web.config   Web.config              10.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)          True True 30698 / http://localhost:50012/ False False   False         <!-- To modify your build process, add your task inside one of the targets below and uncomment it. Other similar extension points exist, see Microsoft.Common.targets.     -->  

这是我从命令行运行MSBuild后看到的错误:

 C:\Users\[myUserName]\Documents\Visual Studio 2012\Projects\Macu.Content\Macu.Conten t>msbuild macu.content.csproj /t:TransformAll Microsoft (R) Build Engine version 4.0.30319.17929 [Microsoft .NET Framework, version 4.0.30319.17929] Copyright (C) Microsoft Corporation. All rights reserved. Build started 1/17/2013 2:16:59 PM. Project "C:\Users\[myUserName]\Documents\Visual Studio 2012\Projects\Macu.Content\M acu.Content\macu.content.csproj" on node 1 (TransformAll target(s)). ExecuteTransformations: Performing incremental T4 transformation Calculating whether transformed output is out of date... Transforming template shared\script\s_code.tt... C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v11.0\TextTemplating\Micr osoft.TextTemplating.targets(396,5): warning : Compiling transformation: The va riable 'isAccountFound' is assigned but its value is never used. Line=24, Colum n=7 [C:\Users\[myUserName]\Documents\Visual Studio 2012\Projects\Macu.Content\Macu. Content\macu.content.csproj] C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v11.0\TextTemplating\Micr osoft.TextTemplating.targets(396,5): error : Running transformation: System.Nul lReferenceException: Object reference not set to an instance of an object.\r [C :\Users\[myUserName]\Documents\Visual Studio 2012\Projects\Macu.Content\Macu.Conten t\macu.content.csproj] C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v11.0\TextTemplating\Micr osoft.TextTemplating.targets(396,5): error : at Microsoft.VisualStudio.TextT emplating7D294BC599798219F70D124BB1976BCDFB50B07280E2004F9365EC71A617D68D059E43 6CBD1AD344727611A619EE41F939B60372B3E16565CA2D4E4B40FBC5C7.GeneratedTextTransfo rmation.TransformText() in c:\Users\[myUserName]\Documents\Visual Studio 2012\Proje cts\Macu.Content\Macu.Content\shared\script\s_code.tt:line 21. Line=21, Column= 0 [C:\Users\[myUserName]\Documents\Visual Studio 2012\Projects\Macu.Content\Macu.Co ntent\macu.content.csproj] Done Building Project "C:\Users\[myUserName]\Documents\Visual Studio 2012\Projects\ Macu.Content\Macu.Content\macu.content.csproj" (TransformAll target(s)) -- FAIL ED. Build FAILED. "C:\Users\[myUserName]\Documents\Visual Studio 2012\Projects\Macu.Content\Macu.Cont ent\macu.content.csproj" (TransformAll target) (1) -> (ExecuteTransformations target) -> C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v11.0\TextTemplating\Mi crosoft.TextTemplating.targets(396,5): warning : Compiling transformation: The variable 'isAccountFound' is assigned but its value is never used. Line=24, Col umn=7 [C:\Users\[myUserName]\Documents\Visual Studio 2012\Projects\Macu.Content\Mac u.Content\macu.content.csproj] "C:\Users\[myUserName]\Documents\Visual Studio 2012\Projects\Macu.Content\Macu.Cont ent\macu.content.csproj" (TransformAll target) (1) -> (ExecuteTransformations target) -> C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v11.0\TextTemplating\Mi crosoft.TextTemplating.targets(396,5): error : Running transformation: System.N ullReferenceException: Object reference not set to an instance of an object.\r [C:\Users\[myUserName]\Documents\Visual Studio 2012\Projects\Macu.Content\Macu.Cont ent\macu.content.csproj] C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v11.0\TextTemplating\Micr osoft.TextTemplating.targets(396,5): error : at Microsoft.VisualStudio.TextT emplating7D294BC599798219F70D124BB1976BCDFB50B07280E2004F9365EC71A617D68D059E43 6CBD1AD344727611A619EE41F939B60372B3E16565CA2D4E4B40FBC5C7.GeneratedTextTransfo rmation.TransformText() in c:\Users\[myUserName]\Documents\Visual Studio 2012\Proje cts\Macu.Content\Macu.Content\shared\script\s_code.tt:line 21. Line=21, Column= 0 [C:\Users\[myUserName]\Documents\Visual Studio 2012\Projects\Macu.Content\Macu.Co ntent\macu.content.csproj] 1 Warning(s) 1 Error(s) Time Elapsed 00:00:01.04 

你能看到我正在做的任何导致错误的事情吗?你知道如何修复它所以我可以使用msbuild而不会遇到这个错误吗?

我担心你无法在构建时成功运行模板,这些模板使用Host变量来获取像DTE这样的IDE服务,因为msbuild T4主机可以在命令行和内置版本中工作。 IDE,因此不会将全局服务提供程序或DTE公开给模板。 从简单的命令行主机texttransform.exe也是如此。

有形T4编辑器中有一个名为Transform On Build的专业function,它允许您在解决方案资源管理器属性网格中将模板标记为“构建时转换”。 每次在Visual Studio(而不是构建服务器)中构建时,这将转换模板。 您的模板也可以访问EnvDTE和其他可视工作室变量。 请参阅: http : //t4-editor.tangible-engineering.com/blog/transforming-t4-templates-on-build.html

我们的一个客户有完全相同的问题,GarethJ是正确的,这是不可能开箱即用的。

但是,您可以编写自己的“TextTransform.exe”工具,该工具可以非常轻松地为模板提供Visual Studio Automation API。 您需要做的就是实现ITextTemplatingEngineHost和IServiceProvider接口,并在请求DTE接口时返回DTE接口的实例。

那就是说:我们写了一篇关于这个场景的博客文章 ,并发布了工具=源代码 。

但需要注意的一点是:您需要在构建服务器上获得正确许可的Visual Studio安装才能实现此function。

matthid @ AIT

我最近在构建过程中遇到了这个问题(不使用DTE )。 我解决了这个问题,确保我的电脑上只有1个texttransform.exe。 出于某种原因,IDE使用的是最新版本的texttransform.exe ,而msbuild使用旧版本。