【问题标题】:T4 "header guard" for included files包含文件的 T4“标头保护”
【发布时间】:2013-01-20 10:50:07
【问题描述】:

我正在尝试为代码生成编写一些漂亮且结构化的 t4。我将我的逻辑分解为可重用的函数并将它们放入单独的文件中(就像“普通”代码一样)。问题是我不能包含一个通用文件,因为它会被包含多次。

例如,我有 4 个文件:Core.ttFile1.ttFile2.ttMainTemplate.ttCore.tt 包含在 File1.ttFile2.tt 中。 而File1.ttFile2.tt 包含在MainTemplate.tt

当我想从MainTemplate.tt 生成输出时,我收到以下错误:

Error   8   Compiling transformation: The type 'Microsoft.VisualStudio.TextTemplating62CD98C8FF0EB737CAFBD5ED17A158C3.GeneratedTextTransformation' already contains a definition for 'PropertyAttribute'

我猜,原因是Core.tt 被包含了两次。我的问题有解决方法吗?在 c++ 中可以添加标头保护:#ifndef xxx #define xxx #endif

【问题讨论】:

  • 我花了不到 2 个小时编写了一个与 T4 等效的东西,它既解决了这个问题,也解决了库模板更改时重新转换所有依赖模板的问题。 T4设计得不好。不要使用它。
  • @Jack:那你介意为 T4 项目做贡献吗?

标签: c# visual-studio code-generation t4


【解决方案1】:

是的,此功能已内置于 T4 系统中。

The T4 'include' directive supports a 'once' attribute,应该确保模板只包含一次,防止重复。

例子:

<#@ include file="filePath.tt" once="true" #>

【讨论】:

  • 这是个好主意!但由于某种原因,我在编译时遇到错误:“意外属性:一次”。我包含这样的文件:“”。你知道为什么会这样吗?我正在使用 Visual Studio 2015 Update 3 和 T4 Toolbox for Visual Studio 14.0.0.76。
【解决方案2】:

不幸的是,我无法找到一种方法来实现它,因为在 C# 中可以使用#define 的位置存在严格的限制,而且#include 在代码中出现得太晚了。

此时,您最好的选择是在 http://visualstudio.uservoice.com 上记录功能请求并尝试争取一些支持。

就我个人而言,我很想将此功能加入到产品中。

【讨论】:

    【解决方案3】:

    我遇到以下错误消息的类似问题:

    Compiling transformation: The type 'GeneratedTextTransformation' already contains a definition for 'BaseCodegenTemplate'
    

    我用 CTRL + SHIFT + F 在我的项目中搜索了这行文本:

    <#@ include file="BaseCodegenTemplate.tt" #>
    

    并在 2 个不同的文件中发现此行出现 2 次。在我从其中一个文件中删除其中一个事件后,错误消失了。

    但是因为 BaseCodegenTemplate.tt 文件的 include 语句现在在该文件中丢失,该文件中的某些代码以红色突出显示,因为 BaseCodegenTemplate.tt 中包含的类型定义丢失。但整体代码编译良好:在构建过程中包含 BaseCodegenTemplate.tt 中定义的类型,因为 BaseCodegenTemplate.tt 在另一个文件中被引用。

    【讨论】:

      猜你喜欢
      • 2013-11-13
      • 1970-01-01
      • 2014-09-10
      • 1970-01-01
      • 2011-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-24
      相关资源
      最近更新 更多