0

いくつかの基準に基づいて条件付きでテンプレートを含めたい T4 テンプレートを作成しています。たとえば、私は次のことを試しました...

<#switch(iocContainer) {#>
<#case "Autofac":#>
    <#@ include file="Autofac\EntityTemplate.ttinclude" #>
    <#@ include file="Autofac\ServiceTemplate.ttinclude" #>
    <#@ include file="Autofac\RepositoryTemplate.ttinclude" #>
    <#@ include 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

4 に答える 4

1

いいえ、T4には設計上条件付きインクルードは含まれていません。ディレクティブはすべて処理されます。

ロジックを逆にすると、これを解決できます。switchステートメントの上下にあるT4コンテンツを2つの別々のファイルに分割します(それらstart.ttincludeをとと呼びましょうend.ttinclude)。次に、、、、などの3つの個別のT4テンプレートを作成autofac.ttcastle.ttますninject.tt。これらはそれぞれ次のようになります(これはcastle.tt):

<#@ include file="start.ttinclude" #>
<#@ include file="Castle\EntityTemplate.ttinclude" #>
<#@ include file="Castle\EntityTemplate.ttinclude" #>
<#@ include file="Castle\EntityTemplate.ttinclude" #>
<#@ include file="Castle\EntityTemplate.ttinclude" #>
<#@ include file="end.ttinclude" #>
于 2012-05-25T14:57:57.010 に答える
1

または、テンプレートのコンテンツを #IF #ENDIF ブロック内に配置し、#DEFINE を使用して、ファイル自体が含まれていてもコンテンツをスキップします。

于 2012-06-04T18:36:56.417 に答える
0

Visual Studio コンテナー内での実行を気にしない場合は、DTE がお手伝いします。

<#@ template hostspecific="true" language="C#" #>
<#@ output extension=".cs" #>
<#@ assembly name="EnvDTE" #>
<#@ Assembly Name="System.Core" #>
<#@ Assembly Name="System.Data" #>
<#@ Assembly Name="System.Xml" #>
<#@ Assembly Name="System.Xml.Linq" #>
<#@ import namespace="EnvDTE" #>
<#@ import namespace="System" #>
<#@ Import namespace="System.Linq"                    #>
<#@ Import namespace="System.Reflection"              #>
<#@ Import namespace="System.Linq.Expressions"        #>
<#@ Import namespace="System.Collections.Generic"     #>
<#@ Import namespace="System.Linq"                    #>
<#@ Import namespace="System.Text"                    #>
<# 
    if(isDefined("spike2" , "TTs")) {
        WriteLine("//the constant TTs is defined");
    }
    else
    {
        WriteLine("//the constant TTs is not defined");
    }
#>
<#+
        private bool isDefined(string projectName, string constantToCheck){
            IServiceProvider serviceProvider = (IServiceProvider)this.Host;
            DTE dte = serviceProvider.GetService(typeof(DTE)) as DTE;  

            try
            {   
                // find a project called "Spike2"
                Project prj = (from p in getProjects(dte) where p.Name.ToLower() == projectName.ToLower() select p).FirstOrDefault(); 

                // get its active configuration
                var config = prj.ConfigurationManager.ActiveConfiguration;


                var defineConstants = (from p in getConfigProperties(config) where p.Name == "DefineConstants" select p.Value).FirstOrDefault().ToString(); 
                var constants = defineConstants.Split(';');
                return Array.Exists(constants, define => define == constantToCheck);
            }
            catch(Exception ex)
            {
                Write(ex.Message);
            }
            return false;
        }

        static private IEnumerable<Property> getConfigProperties(Configuration config) {
            for(int i=1; i <=  config.Properties.Count; i++)
            {
                yield return  config.Properties.Item(i);
            }
        }

        static private IEnumerable<Project> getProjects(DTE dte) {
            for(int i=1; i <= dte.Solution.Projects.Count; i++)
            {
                yield return dte.Solution.Projects.Item(i);
            }
        }
#>
于 2014-08-21T06:21:43.400 に答える