Можете ли вы выполнить RunCustomTool с EnvDTE в качестве события перед сборкой? - PullRequest
9 голосов
/ 26 февраля 2010

Я использую T4MVC и не могу использовать событие предварительной сборки для запуска TextTransform.exe, так как он использует EnvDTE, и его необходимо запускать с Visual Studio в качестве хоста.

Если я запустилПользовательский инструмент один раз, он работает хорошо, потому что он помечает себя грязным при запуске (AlwaysKeepTemplateDirty = true), но когда вы открываете решение, он не запускается при сборке, поэтому мне было интересно, можно ли запустить t4 через EnvDTE в качестве предварительногособытие?

Ответы [ 2 ]

16 голосов
/ 27 февраля 2010

Я нашел способ сделать это. Это не оптимально, но на самом деле работает. Если вы подключаетесь к BuildEvents.OnBuildBegin.

Вы нажимаете ALT + F11, чтобы перейти к Macro IDE, нажимаете EnvironmenEvents и добавляете обработчик событий в фрагмент кода ниже. Убедитесь, что он добавлен вне раздела сгенерированного кода.

EnvironmentEvents теперь выглядит так:

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 голос
/ 26 февраля 2010

Это определенно одна из областей T4MVC, которую я хотел бы решить, но не смог найти отличного решения. Я сделал некоторую попытку в то время использовать событие перед сборкой, но ничего интересного не получилось. Что не значит, что это невозможно сделать.

Извините, у меня нет решения для вас, но если кто-то придумает что-то, я был бы рад интегрировать его в T4MVC.

David

...