构建时 T4 转换的产物仅在下一次构建中使用。

18

我有一个包含以下内容的VS项目:

  1. 一个预构建操作,在template.tt上运行TextTransform以生成generated.cs

  2. generated.cs被列为要编译的文件之一(即在项目文件列表中)

当我构建项目时,预构建操作会被执行,generated.cs会重新创建,但VS会编译先前版本的generated.cs(我猜测它在构建过程启动时加载了内存中的先前版本)。

如何让构建使用generated.cs的新版本(即在预构建操作中生成的版本)?如何强制更改构建顺序?

请注意,文本转换输入是动态的,因此无法在设计时完成。

2个回答

4
现在这个问题有了解决方案!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.CSharp.targets之后包含Microsoft.TextTemplating.targets文件。

这将生成文件,但省略它们的相对命名空间。我该如何克服这个问题? - Tomer W

4

我认为你不需要自定义预构建操作。只需将".tt"文件添加到您的项目中,并将其"Custom Tool"属性设置为"TextTemplatingFileGenerator"。您可能需要确保*.generated.cs文件也已添加到项目中,但我认为VS会处理这个问题。


6
对我来说,这似乎不起作用。我认为Zvika的意思是他们希望在构建项目时T4模板能发挥其神奇作用。这也是我想要的。尽管如此,我正在使用ASP.NET MVC 3的T4MVC。例如,如果我拿一个可以构建的项目,并添加一个应该被T4MVC捕获的新文件,然后再次构建项目,我看不到T4MVC应该完成的更改。我必须通过右键单击.tt文件并选择“运行自定义工具”来明确触发更新。 - Derek Morrison
只有在保存.tt文件时才会生成输出。 - Tomer W

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接