我正在创建一个T4模板,我希望有条件地包括基于一些标准的模板。例如,我尝试了以下...
<#switch(iocContainer) {#>
<#case "Autofac":#>
<#@ include file="Autofac\EntityTemplate.ttinclude" #>
<#@ include file="Autofac\ServiceTemplate.ttinclude" #>
<#@ include file="Autofac\RepositoryTemplate.ttinclude" #>
<#@ include file="Autofac\DbContextTemplate.ttinclude" #>
<#break;#>
<#case "Castle":#>
<#@ include file="Castle\EntityTemplate.ttinclude" #>
<#@ include file="Castle\ServiceTemplate.ttinclude" #>
<#@ include file="Castle\RepositoryTemplate.ttinclude" #>
<#@ include file="Castle\DbContextTemplate.ttinclude" #>
<#break;#>
<#case "nInject":#>
<#@ include file="nInject\EntityTemplate.ttinclude" #>
<#@ include file="nInject\ServiceTemplate.ttinclude" #>
<#@ include file="nInject\RepositoryTemplate.ttinclude" #>
<#@ include file="nInject\DbContextTemplate.ttinclude" #>
<#break;
}#>
问题是,当模板引擎运行时,它似乎在计算任何代码之前预处理了所有包含。所以上面的switch语句没有运行,T4尝试包含所有文件。
有没有一种方法可以有条件地包含T4模板?
4条答案
按热度按时间ttygqcqt1#
否,T4在设计上不包含条件包含。所有指令都将被处理。
如果你颠倒一下你的逻辑,你就能解决这个问题。将switch语句上方和下方的T4内容拆分为两个单独的文件(我们称之为
start.ttinclude
和end.ttinclude
)。然后创建三个单独的T4模板,分别称为autofac.tt
、castle.tt
和ninject.tt
。它们看起来都像这样(这是castle.tt
):ymzxtsji2#
或者,将模板的内容放在#IF #ENDIF块中,并使用#DEFINES来跳过内容,即使文件本身也包含在内。
neekobn83#
如果您不介意在Visual Studio容器中运行,那么DTE可以在这里帮助您。
wnavrhmk4#
我想为每台开发人员机器包含一个不同的配置文件,并有一个默认的app.config。只有当您不想处理“包含”文件时,这才有效。
文件名App.tt。