2009-12-16 2 views
13

전체 솔루션에 대해 '사용자 지정 도구 실행'방법이 있습니까?전체 솔루션에 대한 사용자 지정 도구 실행

왜? 커스텀 툴이 개발 중이며, 변경이 이루어지면 아무것도 사용하지 않는 아이템을 새로 고쳐야합니다.

+0

지속적인 통합에 대해 이야기하고 있습니까? –

+0

아니요 CI 번호. 우리는 코드 생성을 위해 여러 개의 t4 파일을 사용하며 빌드 할 때마다 이러한 모든 것을 변환하는 EXE를 실행하는 것이 좋습니다. – Will

답변

8

나는 이에 대한 해답이 필요하고 직접 만들어야하기 때문에 "Run Custom Tool"에 대한 해결책이 있습니다.

그냥 다시 모든 T4 템플릿을 실행해야하는 경우

후 VS2012 이후 빌드 메뉴에있는 모든 T4 변환이있다.

VS2017의 경우 매크로를 제거 했으므로 https://msdn.microsoft.com/en-us/library/cc138589.aspx을 따르고 대신 메뉴 항목으로 플러그인을 만드십시오. 예 :

internal sealed class RefreshAllResxFiles 
{ 
    public const int CommandId = 0x0100; 
    public static readonly Guid CommandSet = new Guid(copy the guid from guidRefreshAllResxFilesPackageCmdSet from the vsct file); 
    private readonly Package _package; 
    private readonly DTE2 _dte; 

    /// <summary> 
    /// Initializes a new instance of the <see cref="RefreshAllResxFiles"/> class. 
    /// Adds our command handlers for menu (commands must exist in the command table file) 
    /// </summary> 
    /// <param name="package">Owner package, not null.</param> 
    private RefreshAllResxFiles(Package package) 
    { 
    _package = package ?? throw new ArgumentNullException(nameof(package)); 

    var commandService = ServiceProvider.GetService(typeof(IMenuCommandService)) as OleMenuCommandService; 
    if (commandService != null) 
    { 
     var menuCommandId = new CommandID(CommandSet, CommandId); 
     var menuItem = new MenuCommand(MenuItemCallback, menuCommandId); 
     commandService.AddCommand(menuItem); 
    } 
    _dte = ServiceProvider.GetService(typeof(DTE)) as DTE2; 
    } 

    public static RefreshAllResxFiles Instance { get; private set; } 
    private IServiceProvider ServiceProvider => _package; 

    public static void Initialize(Package package) 
    { 
    Instance = new RefreshAllResxFiles(package); 
    } 

    /// <summary> 
    /// This function is the callback used to execute the command when the menu item is clicked. 
    /// See the constructor to see how the menu item is associated with this function using 
    /// OleMenuCommandService service and MenuCommand class. 
    /// </summary> 
    private void MenuItemCallback(object sender, EventArgs e) 
    { 
    foreach (Project project in _dte.Solution.Projects) 
     IterateProjectFiles(project.ProjectItems); 
    } 

    private void IterateProjectFiles(ProjectItems projectProjectItems) 
    { 
    foreach (ProjectItem file in projectProjectItems) 
    { 
     var o = file.Object as VSProjectItem; 
     if (o != null) 
      ProcessFile(o); 
     if (file.SubProject?.ProjectItems != null) 
      IterateProjectFiles(file.SubProject.ProjectItems); 
     if (file.ProjectItems != null) 
      IterateProjectFiles(file.ProjectItems); 
    } 

    } 

    private void ProcessFile(VSProjectItem file) 
    { 
    if (file.ProjectItem.Name.EndsWith(".resx")) 
    { 
     file.RunCustomTool(); 
     Log(file.ProjectItem.Name); 
    } 
    } 
    public const string VsWindowKindOutput = "{34E76E81-EE4A-11D0-AE2E-00A0C90FFFC3}"; 

    private void Log(string fileName) 
    { 
    var output = _dte.Windows.Item(VsWindowKindOutput); 
    var pane = ((OutputWindow)output.Object).OutputWindowPanes.Item("Debug"); 
    pane.Activate(); 
    pane.OutputString(fileName); 
    pane.OutputString(Environment.NewLine); 
    } 
} 

그리고 매크로에 대한 기존의 솔루션 :

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

Public Module RecordingModule 
    Sub IterateFiles() 
     Dim solution As Solution = DTE.Solution 
     For Each prj As Project In solution.Projects 
      IterateProjectFiles(prj.ProjectItems) 
     Next 
    End Sub 

    Private Sub IterateProjectFiles(ByVal prjItms As ProjectItems) 
     For Each file As ProjectItem In prjItms 
      If file.Object IsNot Nothing AndAlso TypeOf file.Object Is VSProjectItem Then 
       AddHeaderToItem(file.Object) 
      End If 
      If file.SubProject IsNot Nothing AndAlso file.SubProject.ProjectItems IsNot Nothing AndAlso file.SubProject.ProjectItems.Count > 0 Then 
       IterateProjectFiles(file.SubProject.ProjectItems) 
      End If 
      If file.ProjectItems IsNot Nothing AndAlso file.ProjectItems.Count > 0 Then 
       IterateProjectFiles(file.ProjectItems) 
      End If 
     Next 
    End Sub 

    Private Sub AddHeaderToItem(ByVal file As VSProjectItem) 
     If file.ProjectItem.Name.EndsWith(".resx") Then 
      file.RunCustomTool() 
      Log(file.ProjectItem.Name) 
     End If 
    End Sub 
    Private Sub Write(ByVal name As String, ByVal message As String) 
     Dim output As Window = DTE.Windows.Item(EnvDTE.Constants.vsWindowKindOutput) 
     Dim window As OutputWindow = output.Object 
     Dim pane As OutputWindowPane = window.OutputWindowPanes.Item(name) 
     pane.Activate() 
     pane.OutputString(message) 
     pane.OutputString(Environment.NewLine) 
    End Sub 
    Private Sub Log(ByVal message As String, ByVal ParamArray args() As Object) 
     Write("Debug", String.Format(message, args)) 
    End Sub 

    Private Sub Log(ByVal message As String) 
     Write("Debug", message) 
    End Sub 

End Module 
명령의 RefreshAllResxFiles 이름을 지정하고이 파일 붙여 넣기 (VSLangProj에 대한 DLL을 포함 나던 기본 명령어 세트를, 그래서 그냥 appropiate의 NuGet의 패키지를 찾을 수)
+1

이것은 매크로 코드입니다. 매크로 IDE의 도구> 매크로> 매크로 IDE에서이 코드를 추가 할 수 있습니다. – Sjoerd

+0

VS2017 기준 4.7.02558 "모든 T4 템플릿 변환"이 다시 빌드 메뉴에 있습니다. – smirkingman

15

Visual Studio 2010에는 솔루션 탐색기의 아이콘 막대에 솔루션의 모든 t4 템플릿을 실행하는 단추가 있습니다.

Visual Studio 2012에서 "빌드"도구 모음을 표시하십시오. 해당 툴바에는 솔루션의 모든 t4 템플릿을 실행하는 버튼이 있습니다.

+0

Visual Studio 2015에는 여전히 있습니다. – Slion

3

Visual Studio 2010의 솔루션에서 모든 T4 템플릿을 실행할 수 있습니다. 상단 툴바 공간을 마우스 오른쪽 버튼으로 클릭하고 "빌드"도구 모음을 활성화하십시오. 이것은 다음과 같이 도구 모음을 추가합니다 :

  • 빌드 선택
  • 솔루션 빌드
  • 모든 T4 템플릿

당신이 무엇을 당신에게 제공한다 "모든 T4 템플릿을 변환"취소 변환 필요.

0

다른 답변에서 제공된 솔루션을 사용하지만 솔루션의 모든 템플릿을 실행하는 데 너무 오래 걸리며 템플릿의 하위 집합만으로 충분하다고 판단한 사용자는 여러 번 실행할 수 있습니다. 다음 단계를 사용하여 템플릿을 만듭니다.

  1. Visual Studio의 솔루션 탐색기에서 실행할 템플릿을 선택하십시오. 실제로 파일을 선택해야합니다 - 포함하지 않는 폴더가입니다.
  2. 선택한 템플릿 파일 중 하나를 마우스 오른쪽 단추로 클릭하고 컨텍스트 메뉴에서 Run Custom Tool을 선택하십시오.