web-dev-qa-db-fra.com

Prise en charge de MSBuild pour les modèles T4 dans Visual Studio 2017 RTM

Dans Visual Studio 2015, j'utilise le package NuGet Unofficial.Microsoft.VisualStudio.TextTemplating.14.0.0 qui me permet de transformer des modèles T4 directement à partir de MSBuild, chaque fois qu'un projet est construit.

Cependant, dans Visual Studio 2017 RTM, la construction est interrompue avec les messages suivants:

An Exception was thrown while running the transformation code. The process cannot continue. The following Exception was thrown: System.IO.FileNotFoundException: Could not load file or Assembly 'Microsoft.CodeAnalysis, Version=1.3.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The system cannot find the file specified. File name: 'Microsoft.CodeAnalysis, Version=1.3.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'

Ceci est généré par le fichier Unofficial.Microsoft.VisualStudio.TextTemplating.targets(396,5) qui se trouve dans ce paquet. 

Mon hypothèse est que l'erreur vient d'essayer d'utiliser ces cibles à partir d'une version de VS 2017 en raison d'environnements incohérents, mais je ne sais pas comment retracer le problème exact. Il n'y a pas encore de paquet mis à jour pour la v15 que je puisse voir.

Comment puis-je effectuer des transformations T4 à partir de MSBuild qui fonctionneront pour VS 2017? Y aura-t-il un nouveau paquet de NuGet à utiliser à un moment ou est-ce que cela ne sera plus supporté?

15
Sam

J'ai trouvé la bonne solution.

Il s’avère que le SDK T4 fait maintenant partie de Visual Studio 2017 (et ne fait plus partie du SDK de modélisation séparé comme par le passé), MAIS vous devez l’installer via le jeu d’outils Visual Studio extension development dans le programme d’installation VS2017 (Modèle de texte Fonction de transformation).

Une fois que cela est installé, vous pouvez utiliser MSBuild pour transformer des modèles en important les cibles pertinentes dans le projet MSBuild:

<PropertyGroup>
    <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">15.0</VisualStudioVersion>
    <VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
    <TransformOnBuild>True</TransformOnBuild>
    <TransformOutOfDateOnly>false</TransformOutOfDateOnly>
</PropertyGroup>

<!-- add AFTER import for $(MSBuildToolsPath)\Microsoft.CSharp.targets -->
<Import Project="$(VSToolsPath)\TextTemplating\Microsoft.TextTemplating.targets" />

Cela a résolu mon problème et supprime également le besoin du package distinct non officiel NuGet.

22
Sam

J'avais un problème similaire. Mon T4 ne générerait pas sur la construction, mais économiserait. C'était bizarre car je n'ai pas eu d'erreur, mais en lisant la réponse de @ Sam, j'ai pensé qu'il y avait un problème avec mon installation de VS Et j'avais raison. VS 2017 15.9.4 est installé dans son propre répertoire d'installation, mais ne copie pas Tools dans le dossier VSToolsPath. Au lieu de cela, il les laisse simplement où ils sont. Donc, pour moi, la bonne solution consistait à utiliser ceci <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <Import Project="$(VsInstallRoot)\MSBuild\Microsoft\VisualStudio\v15.0\TextTemplating\Microsoft.TextTemplating.targets" />

0
Cubelaster