2010-02-26 21 views
9

Używam T4MVC i nie mogę użyć zdarzenia pre-build do uruchomienia TextTransform.exe, ponieważ polega on na EnvDTE, i musi być uruchamiany z Visual Studio jako hosta.Czy można zrobić RunCustomTool z EnvDTE jako zdarzenie pre-build?

Jeśli raz uruchomiłem narzędzie niestandardowe, działa dobrze, ponieważ zaznacza się jako brudne po wykonaniu (AlwaysKeepTemplateDirty = true), ale po otwarciu rozwiązania nie działa w trybie kompilacji, więc zastanawiałem się, czy można uruchomić t4 za pośrednictwem EnvDTE jako zdarzenia pre-build?

Odpowiedz

16

ja wymyśliliśmy sposób, aby to zrobić. Nie jest optymalny, ale działa. Jeśli podłączasz się do BuildEvents.OnBuildBegin.

Naciskasz ALT + F11, aby przejść do Macro IDE, kliknij EnvironmenEvents i dodaj moduł obsługi zdarzenia w poniższym fragmencie kodu. Upewnij się, że został dodany poza sekcją kodu wygenerowaną automatycznie.

EnvironmentEvents teraz wygląda tak:

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! Najlepsze rozwiązanie jeszcze :) –

+1

Brilliant. Zastanawiam się nad różnymi sposobami wykorzystania tego punktu rozszerzenia IDE. – Hal

+3

Ponieważ to nie działa w VS 2012 z powodu braku makr, zrobiłem rozszerzenie, które robi to samo: http://visualstudiogallery.msdn.microsoft.com/8d820b76-9fc4-429f-a95f-e68ed7d3111a. Źródło na https://github.com/bennor/AutoT4MVC –

1

Jest to zdecydowanie jeden z obszarów T4MVC, który chciałbym rozwiązać, ale nie udało się znaleźć dobrego rozwiązania. Zrobiłem niektóre próby próbować użyć pre-build zdarzenia, ale nie dostałem nigdzie interesujące. Co nie znaczy, że nie da się tego zrobić.

Przykro mi, nie mam dla ciebie rozwiązania, ale jeśli ktoś coś wymyśli, chętnie zintegruję go z T4MVC.

David