4

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

例如,我有 4 个文件:Core.ttFile1.tt和. 都包含在和中。虽然和包含在File2.ttMainTemplate.ttCore.ttFile1.ttFile2.ttFile1.ttFile2.ttMainTemplate.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

4

3 回答 3

2

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

T4 'include' 指令支持 'once' 属性,它应该确保模板只包含一次,防止重复。

例子:

<#@ include file="filePath.tt" once="true" #>
于 2017-08-17T18:05:54.040 回答
1

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

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

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

于 2013-02-05T17:52:02.070 回答
0

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

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

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

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

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

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

于 2017-08-17T17:59:23.797 回答