Ведение журнала из msbuild Custom Task с использованием класса Console - PullRequest
3 голосов
/ 28 февраля 2011

Я пытаюсь преобразовать существующий инструмент командной строки в пользовательскую задачу msbuild. Этот инструмент регистрирует сообщения и ошибки, используя класс System.Console.
Я добавил в сборку инструмента класс, который наследуется от Microsoft.Build.Utilities.Task и вызывает основную функцию инструмента, и пользовательский инструмент работает нормально - но сообщения / ошибки не отображаются (в окне вывода Visual Studio).

Я бы хотел избежать изменения исходного кода инструмента (в противном случае я мог бы изменить каждый «Console.Error.WriteLine» на «Log.LogError»). Я думал об изменении потоков консоли stdout и stderr, вызывая Console.SetOut и SetError перед вызовом основной функции инструмента. Для этого мне нужно реализовать класс, который наследуется от TextWriter.

Итак, мои вопросы:

  1. Почему записи System.Console не автоматически отправляется в журнал BuildSystem
  2. наследует от TextWriter и устанавливает потоки консоли - хорошо решение этой проблемы?
  3. Возможно, кто-то уже сделал это работать и написал TextWriter реализация для отправки вывод / ошибка в журнал msbuild?
  4. Если нет, где я могу найти ссылочный код, который дает пример класса, который реализует TextWriter

Спасибо.

Ответы [ 2 ]

2 голосов
/ 28 февраля 2011
Public Class TaskLogger
Inherits TextWriter

Public Enum TaskLoggerType
    out
    err
End Enum

Private m_logger As TaskLoggingHelper
Private m_logger_type As TaskLoggerType

Sub New(ByRef logger As TaskLoggingHelper, ByVal type As TaskLoggerType)
    m_logger = logger
    m_logger_type = type
End Sub

Public Overrides ReadOnly Property Encoding As System.Text.Encoding
    Get
        Return System.Text.Encoding.Default
    End Get
End Property

Public Overrides Sub WriteLine(ByVal value As String)
    Select Case m_logger_type
        Case TaskLoggerType.out
            m_logger.LogMessage(value)
        Case TaskLoggerType.err
            m_logger.LogError(value)
    End Select
End Sub
End Class

...

Public Overrides Function Execute() As Boolean
    Dim oldOut As TextWriter = Console.Out
    Dim oldErr As TextWriter = Console.Error
    Dim newOut As TextWriter = New TaskLogger(Log, TaskLogger.TaskLoggerType.out)
    Dim newErr As TextWriter = New TaskLogger(Log, TaskLogger.TaskLoggerType.err)
    Console.SetOut(newOut)
    Console.SetError(newErr)
    Dim result As Boolean = Run(...)
    Console.SetOut(oldOut)
    Console.SetOut(oldErr)
    Return result
End Function
0 голосов
/ 28 февраля 2011

Одним из вариантов может быть задача-обертка, наследуемая от ToolTask, которая просто вызывает этот внешний инструмент, и сообщения stdout / stderr будут регистрироваться правильно. Вы даже можете переопределить LogEventsFromTextOutput и правильно сопоставлять и регистрировать ошибки и предупреждения, которые будут отображаться в VS. Например. LC.cs

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...