Étienne Baudoux // Notes

Générer tous les T4 Text Templates à la compilation

// 10/15/2017

Hello World à tous !

Si comme moi vous utilisez du T4 Text Templates (fichiers .TT) dans vos projets avec Visual Studio et avez besoin de les générer avant chaque compilation, cet article est pour vous.

Depuis un certain temps, je me suis mis en tête d'avoir une numéro de version d'Assembly qui correspond à Année.Mois.Jour.NombreDeBuildDansLaJournée. Pour générer celà, rien de tel qu'un peu de méta-programmation avec du T4. Et comme je suis un fénéant, j'ai envie de faire en sorte de générer automatiquement tous mes fichiers T4 avant la compilation. Ces dernières années, j'ai utilisé plusieurs façons de faire dans divers projets sous Visual Studio 2013, 2015 et maintenant 2017, souvent bancales. Entre les lignes de commandes en Pre-Build, les chemins qui n'existent plus d'une version à une autre de Visual Studio voir d'une machine à une autre, et bien j'étais gâté.

Il semblerait que la méthode que j'utilise à présent est relativement stable, du moins avec Visual Studio 2017. Elle fonctionne bien avec un projet WPF, UWP, et elle est le fruit d'un mix de plusieurs solutions trouvées il y a quelques mois sur StackOverflow. Désolé de ne pas avoir retrouvé les liens qui m'avaient servis à l'époque.

Bref, ma solution...

Elle consiste à simplement ajouter quelques lignes au .CSPROJ.

  <PropertyGroup>
    <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">15.0</VisualStudioVersion>
    <VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
    <OverwriteReadOnlyOutputFiles>true</OverwriteReadOnlyOutputFiles>
    <TransformOnBuild>True</TransformOnBuild>
    <TransformOutOfDateOnly>false</TransformOutOfDateOnly>
  </PropertyGroup>
  <ItemGroup>
    <T4ReferencePath Include="$(VSInstallDir)Common7\IDE\PublicAssemblies">
      <InProject>False</InProject>
    </T4ReferencePath>
  </ItemGroup>

Et tout à la fin du fichier, ajouter également :

  <Import Project="$(VSToolsPath)\TextTemplating\Microsoft.TextTemplating.targets" />

Si vous utilisez une autre version majeure de Visual Studio, vous aurez sûrement besoin de changer le noeud "VisualStudioVersion".

Et voilà ! Faîtes Générer, et normalement, Visual Studio devrait regénérer tous les templates avant de compiler.

Enjoy !

I use cookies to sprinkle some digital magic. 🍪