2010-02-26 18 views
9

J'utilise T4MVC et je ne peux pas utiliser un événement de pré-construction pour exécuter TextTransform.exe car il dépend d'EnvDTE et doit être exécuté avec Visual Studio en tant qu'hôte. Si j'ai exécuté une fois l'outil personnalisé, il fonctionne bien parce qu'il se marque sale quand il est exécuté (AlwaysKeepTemplateDirty = true), mais lorsque vous ouvrez la solution, il ne fonctionne pas sur build, donc je me demandais si vous pouviez courir t4 via EnvDTE comme un événement de pré-construction?Pouvez-vous faire un RunCustomTool avec EnvDTE en tant qu'événement de pré-construction?

Répondre

16

J'ai trouvé un moyen de le faire. Ce n'est pas optimal, mais cela fonctionne réellement. Si vous vous connectez à BuildEvents.OnBuildBegin.

Vous appuyez sur ALT + F11 pour accéder au Macro IDE, cliquez sur EnvironmenEvents et ajoutez le eventhandler dans l'extrait de code ci-dessous. Assurez-vous qu'il est ajouté en dehors de la section de code générée automatiquement.

Le EnvironmentEvents ressemble maintenant à ceci:

Option Strict Off 
Option Explicit Off 
Imports System 
Imports EnvDTE 
Imports EnvDTE80 
Imports EnvDTE90 
Imports System.Diagnostics 

Public Module EnvironmentEvents 

    Public Sub BuildEvents_OnBuildBegin(ByVal Scope As EnvDTE.vsBuildScope, ByVal Action As EnvDTE.vsBuildAction) Handles BuildEvents.OnBuildBegin 
     If Scope = vsBuildScope.vsBuildScopeSolution Or Scope = vsBuildScope.vsBuildScopeProject Then 
      Dim projectItem As ProjectItem = DTE.Solution.FindProjectItem("T4MVC.tt") 
      If Not projectItem Is Nothing Then 
       If Not projectItem.IsOpen Then 
        projectItem.Open() 
       End If 
       projectItem.Save() 
      End If 
     End If 
    End Sub 

#Region "Automatically generated code, do not modify" 
'Automatically generated code, do not modify 
'Event Sources Begin 
<System.ContextStaticAttribute()> Public WithEvents DTEEvents As EnvDTE.DTEEvents 
<System.ContextStaticAttribute()> Public WithEvents DocumentEvents As EnvDTE.DocumentEvents 
<System.ContextStaticAttribute()> Public WithEvents WindowEvents As EnvDTE.WindowEvents 
<System.ContextStaticAttribute()> Public WithEvents TaskListEvents As EnvDTE.TaskListEvents 
<System.ContextStaticAttribute()> Public WithEvents FindEvents As EnvDTE.FindEvents 
<System.ContextStaticAttribute()> Public WithEvents OutputWindowEvents As EnvDTE.OutputWindowEvents 
<System.ContextStaticAttribute()> Public WithEvents SelectionEvents As EnvDTE.SelectionEvents 
<System.ContextStaticAttribute()> Public WithEvents BuildEvents As EnvDTE.BuildEvents 
<System.ContextStaticAttribute()> Public WithEvents SolutionEvents As EnvDTE.SolutionEvents 
<System.ContextStaticAttribute()> Public WithEvents SolutionItemsEvents As EnvDTE.ProjectItemsEvents 
<System.ContextStaticAttribute()> Public WithEvents MiscFilesEvents As EnvDTE.ProjectItemsEvents 
<System.ContextStaticAttribute()> Public WithEvents DebuggerEvents As EnvDTE.DebuggerEvents 
<System.ContextStaticAttribute()> Public WithEvents ProjectsEvents As EnvDTE.ProjectsEvents 
<System.ContextStaticAttribute()> Public WithEvents TextDocumentKeyPressEvents As EnvDTE80.TextDocumentKeyPressEvents 
<System.ContextStaticAttribute()> Public WithEvents CodeModelEvents As EnvDTE80.CodeModelEvents 
<System.ContextStaticAttribute()> Public WithEvents DebuggerProcessEvents As EnvDTE80.DebuggerProcessEvents 
<System.ContextStaticAttribute()> Public WithEvents DebuggerExpressionEvaluationEvents As EnvDTE80.DebuggerExpressionEvaluationEvents 
'Event Sources End 
'End of automatically generated code 
#End Region 

End Module 
+1

Very nice! Meilleure solution pour le moment :) –

+1

Brilliant. Je pense à toutes sortes de façons d'utiliser ce point d'extension IDE. – Hal

+3

Comme cela ne fonctionne pas dans VS 2012 en raison de l'absence de macros, j'ai fait une extension qui fait la même chose: http://visualstudiogallery.msdn.microsoft.com/8d820b76-9fc4-429f-a95f-e68ed7d3111a. Source sur https://github.com/bennor/AutoT4MVC –

1

Ceci est certainement l'un des domaines de T4MVC que je voudrais résoudre, mais n'ont pas été en mesure de trouver une excellente solution. J'ai fait une certaine tentative à l'époque pour utiliser un événement de pré-construction, mais n'a pas été intéressant. Ce qui ne veut pas dire que ça ne peut pas être fait. Désolé, je n'ai pas de solution pour vous, mais si quelqu'un propose quelque chose, je serais heureux de l'intégrer dans T4MVC.

David