如何在构建时运行TextTemplatingFileGenerator(VS 2017)

6
我发现这个问题以前被问过,但我遇到的所有答案都是针对早期版本的Visual Studio的。似乎大多数是VS2015及更早版本。
大多数答案的主要问题在于它们依赖于Microsoft.TextTemplating.targets和/或TextTransform.exe的存在,这些文件以前安装在早期版本的Visual Studio中,而VS2017不再安装相应的目录或文件;据我所知,这是由于在这方面的架构变化导致的。
我尝试使用Clarius.TransformOnBuild,它工作得很好(一次),但后来开始抛出“TransformOnBuildTask”任务失败,因为我看到其他人也有访问被拒绝的问题。
降级到软件包的早期版本可以解决错误,但是它不再在生成时运行TextTemplatingFileGenerator。这似乎不是一个非常可靠的方法。
其他解决方案建议将TextTransform.exe添加到%PATH%变量中,这又需要团队对其环境进行修改。更不用说我没有TextTransform.exe了,因为第一点,也不能保证团队中的其他开发人员也有。每个人都在运行VS2017。
我只需要一个非常简单的方法,在任何生成过程中都执行项目中的所有.tt文件,而无需整个开发团队为此进行单独的系统修改。
如果有其他人在VS2017下运行类似的要求,我会对解决方法感兴趣。
2个回答

10

如何在VS2017中构建时运行TextTemplatingFileGenerator

正如您所知,如果想在构建过程中执行项目中的所有.tt文件,必须使用Microsoft.TextTemplating.targetsTextTransform.exeAutoT4或任何其他扩展。所有这些方法都需要开发团队个别或多或少地配置其环境。

为了减少开发团队成员的个人配置,通常我们使用Microsoft.TextTemplating.targets。由于T4 SDK现在作为Visual Studio 2017的一部分(而不是作为单独的Modeling SDK),因此我们必须通过Visual Studio扩展开发工具集在VS2017安装程序中安装它(文本模板转换功能):

enter image description here

安装此工作负载后,您可以通过将相关目标导入MSBuild项目来使用MSBuild转换模板:

  <PropertyGroup>
    <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
    <VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
    <TransformOnBuild>true</TransformOnBuild>
    <OverwriteReadOnlyOutputFiles>true</OverwriteReadOnlyOutputFiles>
    <TransformOutOfDateOnly>false</TransformOutOfDateOnly>
  </PropertyGroup>

  <!-- This is the important line: -->
  <Import Project="$(VSToolsPath)\TextTemplating\Microsoft.TextTemplating.targets" />

详见生成过程中的代码生成

希望这可以帮到你。


2
谢谢!实际上这个解决方案非常好用。我真的在寻找一种不需要在任何其他开发者系统上添加额外内容的解决方案,但是这种方法也不错。我注意到模板生成器仅在“重新生成”时进行触发,而不是在“生成”时执行。您有什么建议可以在生成时执行它吗?或者它对您也是这样工作的? - Mark
1
重要提示:导入语句必须在 Microsoft.CSharp.targets 导入语句之后!否则它无法识别 .tt 文件!这在 Microsoft.TextTemplating.targets 文件中有详细说明。 - David Rettenbacher
我使用的东西完全一样,但由于某些原因它对我不起作用。有什么想法吗?关键点是什么?实际上,我们之前设置了这个,但现在无法运行它。我们使用的是VS2017,但现在已经切换到VS2019,它不能为所有.tt工作,只能为一些(不知道为什么)。 - Cubelaster

4
在Visual Studio 2017中(可能适用于下一版本),您应该在预构建事件中添加以下内容:
"$(DevEnvDir)TextTransform.exe" -out "$(ProjectDir)YourTemplate.cs" "$(ProjectDir)YourTemplate.tt"

无需安装Visual Studio扩展开发即可实现简单的解决方案。

p.s. 如果模板不在根项目目录中,请更改路径。


1
我认为这是更合适的答案,因为它不依赖于用户安装VS扩展开发选项。这对于只需要包括TextTemplate.exe在软件中的最小安装的用户来说非常好。如果我将解决方案转移到同事或朋友的计算机上,那么他们也需要安装扩展开发。 - Joel Trauger

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