8

有没有办法通过命令行将构建顺序输出到文本文件?

解释一下:我们使用多个源分支,每个分支都有 100 多个项目的大型解决方案。我需要编写构建脚本来从命令行构建这些解决方案。然后,我们可以在分支上定制解决方案,使其仅包含团队正在处理的项目的项目参考。这应该会大大增加解决方案的加载时间并减轻开发人员和我的挫败感,我希望 :)

我将继续寻找,也许会考虑使用 C# 和 VS 提供的 API。我们正在使用 2012 更新 1。

4

2 回答 2

6

这是 Visual Studio 插件项目的理想选择。

  1. 创建一个新的Visual Studio 加载项项目。
  2. 在项目创建向导中,确保在选择加载项选项步骤中选择以下配置(其他步骤并不重要,我假设您将使用 C#):

在此处输入图像描述

  1. Connect.cs文件中,添加以下字段:

    private BuildEvents _buildEvents;
    private Events _events;
    private bool buildEventConnected = false;
    
  2. 并相应地添加/修改这些方法:

    public void OnConnection(object application, ext_ConnectMode connectMode, object addInInst, ref Array custom)
    {
        _applicationObject = (DTE2)application;
        _addInInstance = (AddIn)addInInst;
        _events = _applicationObject.Events;
        _buildEvents = _events.BuildEvents;
    
        if (connectMode != ext_ConnectMode.ext_cm_UISetup && !buildEventConnected)
        {
            _buildEvents.OnBuildDone +=
                new _dispBuildEvents_OnBuildDoneEventHandler(BuildEvents_OnBuildDone);
            buildEventConnected = true;
        }
    }
    
    private void BuildEvents_OnBuildDone(vsBuildScope Scope, vsBuildAction Action)
    {
        const string BUILD_OUTPUT_PANE_GUID = "{1BD8A850-02D1-11D1-BEE7-00A0C913D1F8}";
        TextDocument txtOutput = default(TextDocument);
        TextSelection txtSelection = default(TextSelection);
        Window vsWindow = default(Window);
        vsWindow = _applicationObject.Windows.Item(EnvDTE.Constants.vsWindowKindOutput);
        OutputWindow vsOutputWindow = default(OutputWindow);
        OutputWindowPane objBuildOutputWindowPane = default(OutputWindowPane);
        vsOutputWindow = (OutputWindow)vsWindow.Object;
        foreach (OutputWindowPane objOutputWindowPane in vsOutputWindow.OutputWindowPanes)
        {
            if (objOutputWindowPane.Guid.ToUpper() == BUILD_OUTPUT_PANE_GUID)
            {
                objBuildOutputWindowPane = objOutputWindowPane;
                break;
            }
        }
        txtOutput = objBuildOutputWindowPane.TextDocument;
        txtSelection = txtOutput.Selection;
        txtSelection.StartOfDocument(false);
        txtSelection.EndOfDocument(true);
        objBuildOutputWindowPane.OutputString(System.DateTime.Now.ToString());
        txtSelection = txtOutput.Selection;
        var solutionDir = System.IO.Path.GetDirectoryName(_applicationObject.Solution.FullName);
        System.IO.File.WriteAllText(solutionDir + "\\build_output.log", txtSelection.Text);
    }
    
    public void OnDisconnection(ext_DisconnectMode disconnectMode, ref Array custom)
    {
        if (buildEventConnected)
        {
            _buildEvents.OnBuildDone -= new _dispBuildEvents_OnBuildDoneEventHandler(BuildEvents_OnBuildDone);
            buildEventConnected = false;
        }
    }
    

就是这样,在每次构建时,您都会将输出发送到build_output.log解决方案文件夹中的文件。

于 2013-03-01T15:12:44.603 回答
4

快速的方法是做一个“干净的解决方案”,这样你就可以在构建日志中看到倒序。

于 2019-10-09T09:15:31.253 回答