2013-02-05 114 views
4

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

例如,我有4个文件:Core.tt,File1.tt,File2.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

+0

我花了不到2个小时写一个相当于T4这既解决了这个问题,并重新转换所有依赖模板时库模板变化的问题。 T4设计不好。不要使用它。 – Jack

+0

@Jack:你会介意为T4项目做贡献吗? – Vlad

回答

1

不幸的是,我还没有能够找到一种方法来实现它,因为在C#中可以使用#define的地方存在很大的局限性,代码中#include来得太晚。

在这一点上最好的选择是登录http://visualstudio.uservoice.com的功能请求,并尝试鼓励一些支持。

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

0

我是有以下错误消息类似的问题:

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

我搜索我的CTRL + SHIFT + ˚F这行文字的项目:

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

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

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

2

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

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

例子:

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

这是一个好主意!但由于某种原因,我在编译时出错:“意外属性:一次”。我包含这样的文件:“<#@ include file =”BaseCodegenTemplate.tt“once =”true“#>”。你知道这是为什么吗? 我正在使用Visual Studio 2015 Update 3和T4 Toolbox for Visual Studio 14.0.0.76。 –