전체 솔루션에 대해 '사용자 지정 도구 실행'방법이 있습니까?전체 솔루션에 대한 사용자 지정 도구 실행
왜? 커스텀 툴이 개발 중이며, 변경이 이루어지면 아무것도 사용하지 않는 아이템을 새로 고쳐야합니다.
전체 솔루션에 대해 '사용자 지정 도구 실행'방법이 있습니까?전체 솔루션에 대한 사용자 지정 도구 실행
왜? 커스텀 툴이 개발 중이며, 변경이 이루어지면 아무것도 사용하지 않는 아이템을 새로 고쳐야합니다.
나는 이에 대한 해답이 필요하고 직접 만들어야하기 때문에 "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의 패키지를 찾을 수)
이것은 매크로 코드입니다. 매크로 IDE의 도구> 매크로> 매크로 IDE에서이 코드를 추가 할 수 있습니다. – Sjoerd
VS2017 기준 4.7.02558 "모든 T4 템플릿 변환"이 다시 빌드 메뉴에 있습니다. – smirkingman
Visual Studio 2010에는 솔루션 탐색기의 아이콘 막대에 솔루션의 모든 t4 템플릿을 실행하는 단추가 있습니다.
Visual Studio 2012에서 "빌드"도구 모음을 표시하십시오. 해당 툴바에는 솔루션의 모든 t4 템플릿을 실행하는 버튼이 있습니다.
Visual Studio 2015에는 여전히 있습니다. – Slion
Visual Studio 2010의 솔루션에서 모든 T4 템플릿을 실행할 수 있습니다. 상단 툴바 공간을 마우스 오른쪽 버튼으로 클릭하고 "빌드"도구 모음을 활성화하십시오. 이것은 다음과 같이 도구 모음을 추가합니다 :
당신이 무엇을 당신에게 제공한다 "모든 T4 템플릿을 변환"취소 변환 필요.
다른 답변에서 제공된 솔루션을 사용하지만 솔루션의 모든 템플릿을 실행하는 데 너무 오래 걸리며 템플릿의 하위 집합만으로 충분하다고 판단한 사용자는 여러 번 실행할 수 있습니다. 다음 단계를 사용하여 템플릿을 만듭니다.
Run Custom Tool
을 선택하십시오.
지속적인 통합에 대해 이야기하고 있습니까? –
아니요 CI 번호. 우리는 코드 생성을 위해 여러 개의 t4 파일을 사용하며 빌드 할 때마다 이러한 모든 것을 변환하는 EXE를 실행하는 것이 좋습니다. – Will