【发布时间】:2011-12-14 18:48:41
【问题描述】:
我在生成 T4 代码时遇到了一个小问题。
我已将我的 T4 模板分解为单独的文件并将它们放置在不同的目录中,我这样做是为了让我的部分代码生成可以在多个项目中重复使用,例如模型生成、存储库生成和服务生成都包含一个核心 EntityGeneration.tt 文件。
不幸的是,当 TextTemplating 解析我的嵌套包含时,它会在其生成的 .cs 文件中构建一个长 #line 预处理器指令,将所有相对路径组合到最低级别的包含文件。
不幸的是,由于这条路径是由相对路径构成的,它最终会变得不必要地长,实际上它已经超过了最大路径长度(Windows 7)。
如果您感兴趣,这里是生成代码中的错误行:
#line 3 "C:\VS2010\AlbatrossTravelGroup\ASC\AlbatrossTravelGroup.ASC.BusinessRules\Services\Contracts\..\..\..\..\AlbatrossTravelGroup.BusinessRules\Services\Contracts\..\..\..\AlbatrossTravelGroup.Models\Repositories\Contracts\..\..\../AlbatrossTravelGroup.Common/CodeGeneration.tt"
我的问题是,如何禁用将这些指令写入生成的代码文件?如果做不到这一点,我怎样才能在不改变文件结构的情况下避免这个问题?
【问题讨论】:
-
目前,作为临时解决方案,我创建了一个文件夹“CodeGeneration”,在该文件夹中创建了指向要包含的每个 T4 文件的符号链接。然后,它们不是通过相对路径包含其他 T4 文件的每个包含的 T4 文件,而是仅使用文件名。然后在我希望使用这些 T4 模板的最终位置,我使用“CodeGeneration”目录的相对路径。这导致路径长度更短,因为它使用更少的相对路径。如果有人想要完整的解释,我会在需要时发布答案:)
-
我上面的临时解决方案坏了,不知道为什么 Visual Studio 开始无法解析文件。最后我不得不使用注册表来指定额外的 tt 包含目录,不太理想,但似乎是唯一可行的方法。
-
您可以尝试类似here 提供的 VS 宏解决方案。
标签: c# path c-preprocessor t4