Как получить выходные данные Build, список ошибок при запуске Project.Build () в пользовательской задаче сборки? - PullRequest
1 голос
/ 17 ноября 2008

Окружающая среда:

C # проекты, Visual studio 2008, C #, .Net 3.5, MSBuild

Цель:

Запускаю мою собственную задачу сборки для моих проектов на C # и, основываясь на платформе (платформа конфигурации Soln), я делаю некоторые манипуляции с самим объектом Project перед сборкой. Например, установка BuildAction для EmbeddedResource и т. Д.

Как только это будет сделано, я звоню Project.Build(). Я не хочу использовать объект Project в GlobalEngine, потому что он пометит файл как грязный (и извлечение из TFS), как только вы в любом случае измените объект Project.

Проблема:

Поскольку я использую свой собственный экземпляр Engine и Project, я не могу направить выходные данные сборки, ошибки в VS. Я только получаю bool из Project.Build(). Я не нахожу никаких событий, к которым я мог бы подключиться, чтобы разрешить доступ к BuildErrorEventArgs и подобным вещам. Я знаю, что могу использовать Log.LogErrorEvent() для записи сообщений в список ошибок VS. Но для этого мне нужно сначала получить сам вывод сборки.

Код:

// Execute method in my custom build task class, derives from a BaseTask class
public override bool Execute()
{
Engine engine = new Engine();
Project project = new Project(engine);
project.Load(ProjectName);
Log.LogMessage(Microsoft.Build.Framework.MessageImportance.High, "Got the Project");
// Set the project's DefaultTargets to "Build" to be able to build with CSharp targets
project.DefaultTargets = "Build";
IsBuilt = project.Build(); // Isbuilt bool is a property in my BaseTask class
// Here's where I want to get Build output and direct it to VS output window and errorlist window

engine.Shutdown();
return base.Execute();
}

1 Ответ

4 голосов
/ 03 декабря 2008

Я понял это, просто внедрив собственный регистратор и используя Log.LogMessage или LogError в обработчиках событий

public class MyCustomBuildLogger : ILogger
{
    private IEventSource source;

 public void Initialize(IEventSource eventSource)
        {
            this.source = eventSource;
            //Events.ProjectStarted += new ProjectStartedEventHandler(Events_ProjectStarted);
            //Events.ProjectFinished += new ProjectFinishedEventHandler(Events_ProjectFinished);
            Events.WarningRaised += new BuildWarningEventHandler(Events_WarningRaised);
            Events.ErrorRaised += new BuildErrorEventHandler(Events_ErrorRaised);
            Events.BuildFinished += new BuildFinishedEventHandler(Events_BuildFinished);
            //Events.BuildStarted += new BuildStartedEventHandler(Events_BuildStarted);
            Events.MessageRaised += new BuildMessageEventHandler(Events_MessageRaised);
            //Events.CustomEventRaised += new CustomBuildEventHandler(Events_CustomEventRaised);

            Events.MessageRaised += new BuildMessageEventHandler(Events_MessageRaised);
        }

 void Events_ErrorRaised(object sender, BuildErrorEventArgs e)
        {
            // This logs the error to VS Error List tool window
            Log.LogError(String.Empty, 


             String.Empty,
                    String.Empty, 
                    e.File, 
                    e.LineNumber, 
                    e.ColumnNumber,
                    e.LineNumber, 
                    e.ColumnNumber, 
                    e.Message);
           }
}

и в классе MyCustomBuildTask, где вы устанавливаете и загружаете движок и проект,

_logger = new MyCustomBuildLogger();
_logger.Log = Log;
_engine.RegisterLogger(_logger);
...