Le modèle T4 ne se transformera pas avec build

J'utilise VisualStudio Ultimate 2012 (Update 1) sous Windows 7. Je peux obtenir mon modèle T4 pour générer un fichier en: clic droit [fichier tt] / exécuter L'outil personnalisé. Qui fonctionne très bien! (yay pour moi). Cela fonctionne aussi si j'exécute la commande menu:Construire / Transformer Tous Les Modèles T4. Mais je veux l'automatisation! Je rencontre un problème quand j'essaie d'obtenir le fichier de code généré pour être produit avec chaque build -- ce qui est mon but.

J'ai regardé ce: T4 transformation et construction de L'ordre dans Visual Studio

ce n'est pas ce que je veux. Il traite de l'utilisation d'un événement de pré-construction. Je voulais que ça fasse partie de la construction.

et ce: y a-t-il un moyen D'obtenir Visual Studio pour lancer "Transform All Templates" sur une construction réussie?

ce n'est pas ce que je voulais. Il traite de l'utilisation d'un événement post-construction.

puis j'ai trouvé ceci: Comprendre T4: MSBuild Intégration

Oleg Sych blog:

Parfait! C'est ce que je veux. Bien que son blog parle de VS2010, Je l'ai adopté à VS2012 le cas échéant.

j'ai parcouru chacune de ses étapes pour mettre en oeuvre ceci. J'ai installé Visual Studio SDK 2012& Visual Studio de Visualisation et de Modélisation SDK (2012)

j'ai commencé à utiliser le plug-in T4 Tangible, mais en y pensant j'ai utilisé la version bêta de la boîte à outils T4 d'Oleg. Malheureusement, je réussis à obtenir les mêmes résultats: une erreur avec un build.

j'ai suivi ses instructions sur son site et j'ai relu toutes les étapes et pièces. J'ai cherché pendant des jours, et maintenant mon premier post ici. Je suis coincé. Merci pour regarder...

pour récapituler: J'obtiens une erreur quand je construis visual studio 2012 ou quand je lance le msbuild depuis la ligne de commande (mais encore une fois pas quand je exécuter sur mesure Outil ou utilisez le manuel Transformer Tous Les Modèles T4 - les deux fonctionnent bien).

Voici mon t4template appelé s_code.tt:

<#@ template  debug="true" hostSpecific="true" language="C#" #>
<#@ output extension=".js" #>
<#@ assembly name="System.Core" #>
<#@ assembly name="System.Xml" #>
<#@ assembly name="EnvDTE" #>
<#@ assembly name="EnvDTE80" #>
<#@ assembly name="Microsoft.VisualStudio.Shell.Interop.8.0" #>
<#@ import namespace="System.Diagnostics" #>
<#@ import namespace="System" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.IO" #>
<#@ import namespace="EnvDTE" #>
<#@ import namespace="EnvDTE80" #>
<#@ import namespace="Microsoft.VisualStudio.TextTemplating" #>
<#@ import namespace="Microsoft.VisualStudio.Shell.Interop" #>


<#
    IServiceProvider serviceProvider = (IServiceProvider)Host;
    EnvDTE.DTE dte = (EnvDTE.DTE)serviceProvider.GetService(typeof(EnvDTE.DTE));
    var configName = dte.Solution.SolutionBuild.ActiveConfiguration.Name;
    string filename = this.Host.ResolvePath("s_code_source.txt");
    string[] lines = File.ReadAllLines(filename);
    bool isAccountFound = false;
    int linecount = lines.Length;
    int currentline = 0;
    for (int i=0;i<linecount;i++)
    {
        if (Contains_S_Account(lines[i]))
        {
            if (configName.ToUpper() == "DEBUG")
            {
                    WriteLine("var s_account = "macudev2"");
            }
            else if (configName.ToUpper() == "RELEASE")
             {
                   WriteLine("var s_account = "macudev"");
             }

            currentline = i;
            isAccountFound = true;
        }
        else
        {
            WriteLine(lines[i]);
        }
    }
    for (int i=currentline;i<linecount;i++)
    {
        WriteLine(lines[i]);
    }


#>

<#+
private bool Contains_S_Account(string line)
{
    if (line.ToLower().Contains("var s_account"))
    {
        return true;
    }
    else
    {
        return false;
    }
}
#>

Voici mon .csproj fichier:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Import Project="$(MSBuildExtensionsPath)$(MSBuildToolsVersion)Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)$(MSBuildToolsVersion)Microsoft.Common.props')" />
  <PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
    <ProductVersion>
    </ProductVersion>
    <SchemaVersion>2.0</SchemaVersion>
    <ProjectGuid>{0A44E136-F4A4-4B31-95DD-2C8A79FDFAF4}</ProjectGuid>
    <ProjectTypeGuids>{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>
    <OutputType>Library</OutputType>
    <AppDesignerFolder>Properties</AppDesignerFolder>
    <RootNamespace>Macu.Content</RootNamespace>
    <AssemblyName>Macu.Content</AssemblyName>
    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
    <UseIISExpress>true</UseIISExpress>
    <IISExpressSSLPort />
    <IISExpressAnonymousAuthentication />
    <IISExpressWindowsAuthentication />
    <IISExpressUseClassicPipelineMode />
    <TargetFrameworkProfile />
    <TransformOnBuild>True</TransformOnBuild>
    <IncludeFolders>$(MSBuildProjectDirectory)Include</IncludeFolders>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
    <DebugSymbols>true</DebugSymbols>
    <DebugType>full</DebugType>
    <Optimize>false</Optimize>
    <OutputPath>bin</OutputPath>
    <DefineConstants>DEBUG;TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
    <DebugType>pdbonly</DebugType>
    <Optimize>true</Optimize>
    <OutputPath>bin</OutputPath>
    <DefineConstants>TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
  </PropertyGroup>
  <ItemGroup>
    <Reference Include="EnvDTE, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
      <EmbedInteropTypes>True</EmbedInteropTypes>
    </Reference>
    <Reference Include="envdte80, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
      <EmbedInteropTypes>True</EmbedInteropTypes>
    </Reference>
    <Reference Include="Microsoft.CSharp" />
    <Reference Include="Microsoft.VisualStudio.Shell.Interop.10.0, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
      <EmbedInteropTypes>True</EmbedInteropTypes>
    </Reference>
    <Reference Include="Microsoft.VisualStudio.TextTemplating.11.0, Version=11.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" />
    <Reference Include="System" />
    <Reference Include="System.Xml" />
  </ItemGroup>
  <ItemGroup>
    <Content Include="sharedscripts_code.js">
      <AutoGen>True</AutoGen>
      <DesignTime>True</DesignTime>
      <DependentUpon>s_code.tt</DependentUpon>
    </Content>
    <Content Include="sharedscripts_code_source.txt" />
    <Content Include="Web.config" />
  </ItemGroup>
  <ItemGroup>
    <Compile Include="PropertiesAssemblyInfo.cs" />
  </ItemGroup>
  <ItemGroup>
    <Content Include="sharedscripts_code.tt">
      <Generator>TextTemplatingFileGenerator</Generator>
      <LastGenOutput>s_code.js</LastGenOutput>
      <Parameters>
        &lt;%3fxml version="1.0" encoding="utf-16"%3f&gt;
        &lt;ArrayOfParameterStorage xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" /&gt;
      </Parameters>
    </Content>
    <None Include="PropertiesPublishProfilesLocal.pubxml" />
    <None Include="Web.Debug.config">
      <DependentUpon>Web.config</DependentUpon>
    </None>
    <None Include="Web.Release.config">
      <DependentUpon>Web.config</DependentUpon>
    </None>
  </ItemGroup>
  <ItemGroup>
    <T4ReferencePath Include="$(VsInstallDir)PublicAssemblies" />
  </ItemGroup>
  <ItemGroup>
    <Folder Include="sharedimages" />
  </ItemGroup>
  <ItemGroup />
  <ItemGroup>
    <Service Include="{508349B6-6B84-4DF5-91F0-309BEEBAD82D}" />
  </ItemGroup>
  <PropertyGroup>
    <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
    <VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)MicrosoftVisualStudiov$(VisualStudioVersion)</VSToolsPath>
  </PropertyGroup>
  <Import Project="$(MSBuildBinPath)Microsoft.CSharp.targets" />
  <Import Project="$(MSBuildExtensionsPath)MicrosoftVisualStudiov11.0TextTemplatingMicrosoft.TextTemplating.targets" />
  <Import Project="$(VSToolsPath)WebApplicationsMicrosoft.WebApplication.targets" Condition="'$(VSToolsPath)' != ''" />
  <Import Project="$(MSBuildExtensionsPath32)MicrosoftVisualStudiov10.0WebApplicationsMicrosoft.WebApplication.targets" Condition="false" />
  <ProjectExtensions>
    <VisualStudio>
      <FlavorProperties GUID="{349c5851-65df-11da-9384-00065b846f21}">
        <WebProjectProperties>
          <UseIIS>True</UseIIS>
          <AutoAssignPort>True</AutoAssignPort>
          <DevelopmentServerPort>30698</DevelopmentServerPort>
          <DevelopmentServerVPath>/</DevelopmentServerVPath>
          <IISUrl>http://localhost:50012/</IISUrl>
          <NTLMAuthentication>False</NTLMAuthentication>
          <UseCustomServer>False</UseCustomServer>
          <CustomServerUrl>
          </CustomServerUrl>
          <SaveServerSettingsInUserFile>False</SaveServerSettingsInUserFile>
        </WebProjectProperties>
      </FlavorProperties>
    </VisualStudio>
  </ProjectExtensions>
  <PropertyGroup>
    <PreBuildEvent>
    </PreBuildEvent>
  </PropertyGroup>
  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
       Other similar extension points exist, see Microsoft.Common.targets.
  <Target Name="BeforeBuild">
  </Target>
  <Target Name="AfterBuild">
  </Target>
  -->
</Project>

Voici l'erreur que je vois après avoir lancé MSBuild en ligne de commande:

C:Users[myUserName]DocumentsVisual Studio 2012ProjectsMacu.ContentMacu.Conten
t>msbuild macu.content.csproj /t:TransformAll
Microsoft (R) Build Engine version 4.0.30319.17929
[Microsoft .NET Framework, version 4.0.30319.17929]
Copyright (C) Microsoft Corporation. All rights reserved.

Build started 1/17/2013 2:16:59 PM.
Project "C:Users[myUserName]DocumentsVisual Studio 2012ProjectsMacu.ContentM
acu.Contentmacu.content.csproj" on node 1 (TransformAll target(s)).
ExecuteTransformations:
  Performing incremental T4 transformation
  Calculating whether transformed output is out of date...
  Transforming template sharedscripts_code.tt...
C:Program Files (x86)MSBuildMicrosoftVisualStudiov11.0TextTemplatingMicr
osoft.TextTemplating.targets(396,5): warning : Compiling transformation: The va
riable 'isAccountFound' is assigned but its value is never used. Line=24, Colum
n=7 [C:Users[myUserName]DocumentsVisual Studio 2012ProjectsMacu.ContentMacu.
Contentmacu.content.csproj]
C:Program Files (x86)MSBuildMicrosoftVisualStudiov11.0TextTemplatingMicr
osoft.TextTemplating.targets(396,5): error : Running transformation: System.Nul
lReferenceException: Object reference not set to an instance of an object.r [C
:Users[myUserName]DocumentsVisual Studio 2012ProjectsMacu.ContentMacu.Conten
tmacu.content.csproj]
C:Program Files (x86)MSBuildMicrosoftVisualStudiov11.0TextTemplatingMicr
osoft.TextTemplating.targets(396,5): error :    at Microsoft.VisualStudio.TextT
emplating7D294BC599798219F70D124BB1976BCDFB50B07280E2004F9365EC71A617D68D059E43
6CBD1AD344727611A619EE41F939B60372B3E16565CA2D4E4B40FBC5C7.GeneratedTextTransfo
rmation.TransformText() in c:Users[myUserName]DocumentsVisual Studio 2012Proje
ctsMacu.ContentMacu.Contentsharedscripts_code.tt:line 21. Line=21, Column=
0 [C:Users[myUserName]DocumentsVisual Studio 2012ProjectsMacu.ContentMacu.Co
ntentmacu.content.csproj]
Done Building Project "C:Users[myUserName]DocumentsVisual Studio 2012Projects
Macu.ContentMacu.Contentmacu.content.csproj" (TransformAll target(s)) -- FAIL
ED.


Build FAILED.

"C:Users[myUserName]DocumentsVisual Studio 2012ProjectsMacu.ContentMacu.Cont
entmacu.content.csproj" (TransformAll target) (1) ->
(ExecuteTransformations target) ->
  C:Program Files (x86)MSBuildMicrosoftVisualStudiov11.0TextTemplatingMi
crosoft.TextTemplating.targets(396,5): warning : Compiling transformation: The
variable 'isAccountFound' is assigned but its value is never used. Line=24, Col
umn=7 [C:Users[myUserName]DocumentsVisual Studio 2012ProjectsMacu.ContentMac
u.Contentmacu.content.csproj]


"C:Users[myUserName]DocumentsVisual Studio 2012ProjectsMacu.ContentMacu.Cont
entmacu.content.csproj" (TransformAll target) (1) ->
(ExecuteTransformations target) ->
  C:Program Files (x86)MSBuildMicrosoftVisualStudiov11.0TextTemplatingMi
crosoft.TextTemplating.targets(396,5): error : Running transformation: System.N
ullReferenceException: Object reference not set to an instance of an object.r
[C:Users[myUserName]DocumentsVisual Studio 2012ProjectsMacu.ContentMacu.Cont
entmacu.content.csproj]
C:Program Files (x86)MSBuildMicrosoftVisualStudiov11.0TextTemplatingMicr
osoft.TextTemplating.targets(396,5): error :    at Microsoft.VisualStudio.TextT
emplating7D294BC599798219F70D124BB1976BCDFB50B07280E2004F9365EC71A617D68D059E43
6CBD1AD344727611A619EE41F939B60372B3E16565CA2D4E4B40FBC5C7.GeneratedTextTransfo
rmation.TransformText() in c:Users[myUserName]DocumentsVisual Studio 2012Proje
ctsMacu.ContentMacu.Contentsharedscripts_code.tt:line 21. Line=21, Column=
0 [C:Users[myUserName]DocumentsVisual Studio 2012ProjectsMacu.ContentMacu.Co
ntentmacu.content.csproj]

    1 Warning(s)
    1 Error(s)

Time Elapsed 00:00:01.04

pouvez-vous voir tout ce que je fais qui est à l'origine de l'erreur, et savez-vous comment le corriger pour que je puisse utiliser msbuild et ne pas tomber dans cette erreur?

14
demandé sur Community 2013-01-19 03:35:42

4 réponses

je crains que vous ne puissiez pas exécuter avec succès des modèles au moment de la construction qui utilisent la variable Host pour obtenir des services IDE comme le DTE, car le serveur T4 de msbuild est conçu pour fonctionner à la fois à partir de la ligne de commande ainsi que des constructions dans L'IDE, et en tant que tel, n'expose pas le fournisseur de services global ou DTE à des modèles. La même chose est vraie de texttransform.exe, le simple hôte en ligne de commande.

21
répondu GarethJ 2013-01-19 00:39:45

il y a une fonctionnalité dans l'éditeur de T4 tangible appelée Transform On Build qui vous permet de marquer un modèle comme "transform on build" dans la solution explorers property grid. Cela transformera le modèle chaque fois que vous construisez dans Visual Studio (pas construire le serveur). Vos modèles y ont également accès à EnvDTE et à d'autres variables visual studio. Voir: http://t4-editor.tangible-engineering.com/blog/transforming-t4-templates-on-build.html

2
répondu Tim Fischer 2013-03-13 10:43:54

un de nos clients avait exactement le même problème et GarethJ est correct, que cela ne peut pas être fait hors de la boîte.

cependant, vous pouvez écrire votre propre " TextTransform.exe " l'outil qui fournit L'API D'automatisation de studio visuel aux gabarits assez facilement. Tout ce que vous devez faire est de mettre en œuvre le ITextTemplatingEngineHost et IServiceProvider interfaces et retour d'une instance de la DTE interface quand on est demander.

Qui a dit: Nous avons écrit un Blog-Post à propos de ce scénario et publié le Outil = Le Code Source.

une remarque cependant: vous avez besoin d'une installation sous licence appropriée de Visual Studio sur votre serveur de construction pour que cela fonctionne.

matthid @ AIT

2
répondu matthid 2015-08-11 06:11:50

j'ai eu ce problème récemment dans mon processus de construction (pas en utilisant DTE). Je l'ai résolu en m'assurant que je n'avais qu'un texttransform.exe sur mon PC. Pour une raison quelconque, L'IDE utilisait une version récente de texttransform.exe et msbuild un ancien.

1
répondu Wolfgang Grinfeld 2015-01-06 10:19:09