构建时 T4 转换的产品仅在下一个构建中使用
Posted
技术标签:
【中文标题】构建时 T4 转换的产品仅在下一个构建中使用【英文标题】:Product of build-time T4 transformation is used only in the next build 【发布时间】:2010-11-20 13:39:00 【问题描述】:我有一个 VS 项目,其中包含:
在template.tt
上运行TextTransform
以生成generated.cs
的预构建操作
generated.cs
列为要编译的文件之一(即在项目文件列表中)
当我构建项目时,执行了预构建操作,重新创建了generated.cs
,但是VS编译了generated.cs
的先前版本(我猜它是在构建过程开始时加载到内存中的)。
如何使构建使用新版本的generated.cs
(即在预构建操作中生成的那个)?如何强制构建顺序?
请注意,文本转换输入是动态的,因此无法在设计时完成。
【问题讨论】:
【参考方案1】:我认为您不需要自定义预构建操作。只需将“.tt”文件添加到您的项目并将其“自定义工具”属性设置为“TextTemplatingFileGenerator”。您可能希望确保将 *.generated.cs 文件也添加到项目中,但我认为 VS 会处理这个问题。
【讨论】:
这似乎对我不起作用。我认为 Zvika 是说他们希望 T4 模板在他的项目构建时发挥其魔力。这也是我想要的。虽然,我将 T4MVC 与 ASP.NET MVC 3 一起使用。例如,如果我采用一个构建项目,添加一个应该由 T4MVC 拾取的新文件,然后再次构建项目,我看不到变化这应该由 T4MVC 完成。我必须通过右键单击 .tt 文件并选择运行自定义工具来显式触发更新。 这只会在您保存.tt
文件时生成输出。【参考方案2】:
现在有解决这个问题的方法! Oleg Sych 在他的博客上发表了一篇文章,详细介绍了如何使构建时转换发挥作用。
来源:https://web.archive.org/web/20140116193428/http://www.olegsych.com/2010/04/understanding-t4-msbuild-integration/
基本上,您只需在项目文件中包含 T4 构建目标并将 TransformOnBuild 属性设置为 true。
以下是相关摘录:
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<PropertyGroup>
<TransformOnBuild>true</TransformOnBuild>
</PropertyGroup>
<Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\TextTemplating\v10.0\Microsoft.TextTemplating.targets" />
请注意,Microsoft.TextTemplating.targets 文件必须包含在 Microsoft.CSharp.targets 之后。
【讨论】:
这会生成文件但忽略它们的相对命名空间。我该如何克服呢?以上是关于构建时 T4 转换的产品仅在下一个构建中使用的主要内容,如果未能解决你的问题,请参考以下文章
在构建服务器上运行 TextTransform.exe (T4)
让 Visual Studio 在每次构建时运行 T4 模板