构建时 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 转换的产品仅在下一个构建中使用的主要内容,如果未能解决你的问题,请参考以下文章

在运行时(构建时)创建 T4 模板?

如何在构建时在 Blazor 项目中运行 T4 模板

在构建服务器上运行 TextTransform.exe (T4)

让 Visual Studio 在每次构建时运行 T4 模板

T4 代码需要库项目目录,但它使用库获取应用程序的目录,而不是

MSBuild 支持 Visual Studio 2017 RTM 中的 T4 模板