T4 Template (Partie 2/2)

Administrative_Tools

Cet article fait suite à l'article "T4 Template (Partie 1/2)". Dans cette seconde partie d'article, nous allons voir quelques exemples de script permettant différents types de génération de fichier.

Créer un template de génération de fichier :

Dans ce premier exemple, nous allons simplement faire générer un fichier HTML, nous utiliserons la balise <#= System.DateTime.Now.ToString() #> afin de générer la date du jour au sein de notre fichier HTML pour rendre notre fichier dynamique.

Code du fichier T4 :

<#@ template debug="true" hostSpecific="true" #>
<#@ output extension=".html" #>
<#@ Assembly Name="System.Core" #>
<#@ Assembly Name="System.Windows.Forms" #>
<#@ import namespace="System" #>
<#@ import namespace="System.IO" #>
<#@ import namespace="System.Diagnostics" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Collections" #>
<#@ import namespace="System.Collections.Generic" #> 

<html>
	<body>
		Fichier HTML Auto généré : <#= System.DateTime.Now.ToString() #>
	<body>
</html>

Résultat :

<html>
	<body>
		Fichier HTML Auto généré : 22/04/2016 11:01:23
	<body>
</html>

Créer un template de génération de fichiers :

Dans le premier exemple nous avons vu comment générer un premier fichier HTML, dans ce deuxième exemple nous allons voir comment générer plusieurs fichiers à l'aide d'un seul template ainsi que l'utilisation de fonction.

Code du fichier T4 :

<#@ template  debug="true" hostSpecific="true" #>
<#@ output extension=".cs" #>
<#@ Assembly Name="System.Core" #>
<#@ Assembly Name="System.Windows.Forms" #>
<#@ import namespace="System" #>
<#@ import namespace="System.IO" #>
<#@ import namespace="System.Diagnostics" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Collections" #>
<#@ import namespace="System.Collections.Generic" #> 
<#
    GenererFichier();
    SauvegarderSortie("fichier1.html");  

    GenererFichier();
    SauvegarderSortie("fichier2.html");
#>
<#+
    void GenererFichier()
    {
#>
<html>
	<body>
		Fichier HTML Auto généré : <#= System.DateTime.Now.ToString() #>
	<body>
</html>
<#+
    }
#>
<#+
  void SauvegarderSortie(string nomFichierSortie)
  {
      string repertoireTemplate = Path.GetDirectoryName(Host.TemplateFile);
      string cheminFichierSortie = Path.Combine(repertoireTemplate, nomFichierSortie);
      File.WriteAllText(cheminFichierSortie, this.GenerationEnvironment.ToString()); 
      this.GenerationEnvironment.Remove(0, this.GenerationEnvironment.Length);
  }
#>

Résultat :

Nous nous retrouvons avec deux fichiers générés, par contre la solution n'est pas totalement satisfaisante car nous conservons un fichier "Générer" associé à notre template, de plus les fichiers générés ne sont pas associés au projet.

t44

Créer un template de génération de fichiers attachés à notre solution :

Dans ce troisième exemple nous allons voir comment inclure des templates externe ainsi qu'une méthode pour attacher les fichiers à la solution.

Pour se faire nous utiliserons le script MultiOutput.tt (librement téléchargeable à cette adresse : http://www.olegsych.com/2008/03/how-to-generate-multiple-outputs-from-single-t4-template/) que nous inclurons dans notre script de génération. Ce script met à disposition des fonctions permettant la génération de fichiers ainsi que leur attachement au projet actif.

Code du fichier T4 :

<#@ template  debug="true" hostSpecific="true" #>
<#@ output extension=".html" #>
<#@ Assembly Name="System.Core" #>
<#@ Assembly Name="System.Windows.Forms" #>
<#@ import namespace="System" #>
<#@ import namespace="System.IO" #>
<#@ import namespace="System.Diagnostics" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Collections" #>
<#@ import namespace="System.Collections.Generic" #> 
<#@ include file="MultiOutput.tt" #>
<#
    GenererFichier();
    SaveOutput("fichier1.html");

    GenererFichier();
    SaveOutput("fichier2.html");

    DeleteOldOutputs();
#>
<#+
    void GenererFichier()
    {
#>
<html>
	<body>
		Fichier HTML Auto généré : <#= System.DateTime.Now.ToString() #>
	<body>
</html>
<#+
    }
#>

Résultat :

Cette fois-ci les fichiers générés font partie de la solution. Cette différence est très importante en effet dans le cas de la génération de fichiers vb ou cs, ceux-ci devront être attachés à la solution pour être compilés ; car devoir contrôler les attachements à chaque génération peut être un travail fastidieux.

t45

 

Comme on a pu le voir durant ces deux articles et au travers de ces quelques exemples, les possibilités apportées par T4 Template sont nombreuses et permettent une grande souplesse dans la génération de fichiers ou de code. Libre à vous maintenant de manipuler les templates T4 en introduisant par exemple une connexion sur une base de données afin de générer l'ensemble des fichiers DTO d'une DAL.

Enregistrer

Enregistrer

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Captcha *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.