не может получить вывод процесса stdout, если использовался входной поток для аргументов - PullRequest
0 голосов
/ 03 июня 2019

Я отлаживаю # 448 выпуск для инструмента docfx

docfx.exe запускает процесс (wkthmltopdf) и использует входной поток для установки аргументов wkthmltopdf из потока stdin. Затем он пытается получить wkhtmltopdf вывод из потока stdout.

Работает нормально, когда docfx запускается из консоли или как windowsService.

Однако, если docfx запускается как часть конвейера сборки Azure (с использованием сценария командной строки), из wkhtmltopdf нельзя получить выходные данные.

Я обнаружил, что вывод загружается, если аргументы задаются с помощью командной строки, а не с помощью stdin.

Вот исходный код

_htmlToPdfOptions.IsReadArgsFromStdin = false; // hardcoded, I do not know how to set it using docfx parameters

using (var process = new Process
{
    StartInfo = new ProcessStartInfo
    {
        UseShellExecute = false,
        RedirectStandardInput = _htmlToPdfOptions.IsReadArgsFromStdin,
        RedirectStandardOutput = _htmlToPdfOptions.IsOutputToStdout,
        WindowStyle = ProcessWindowStyle.Hidden,
        FileName = Constants.PdfCommandName,
        Arguments = _htmlToPdfOptions + (_htmlToPdfOptions.IsReadArgsFromStdin ? string.Empty : (" "+arguments)), // space is required
    }
})
{
    using(new LoggerPhaseScope(Constants.PdfCommandName))
    {
        Logger.LogVerbose($"Executing {process.StartInfo.FileName} {process.StartInfo.Arguments} ({arguments})");
        process.Start();
        if (_htmlToPdfOptions.IsReadArgsFromStdin)
        {
            using (var standardInput = process.StandardInput)
            {
                standardInput.AutoFlush = true;
                standardInput.Write(arguments);
            }
        }
        if (_htmlToPdfOptions.IsOutputToStdout)
        {
            using (var standardOutput = process.StandardOutput)
            {
                standardOutput.BaseStream.CopyTo(stream);
            }
            if (stream.CanSeek)
                Logger.LogVerbose($"got {process.StartInfo.FileName} output {stream.Length}Bytes");
        }
        process.WaitForExit(TimeoutInMilliseconds);
    }
}

, поэтому, когда docfx запускается из конвейера сборки Azure, он не может получить wkhtmltopdf вывод.

_htmlToPdfOptions.IsReadArgsFromStdin = false; эта строка была жестко задана, чтобы она работала в службе Windows. Это меняет способ предоставления wkhtmltopdf аргументов, а stdin не используется.

Есть ли способ использовать stdin и stdout для одного и того же процесса в конвейере сборки Azure?

Я пытался использовать process.StandardOutput.ReadToEnd();, но не повезло. Возвращает пустую строку, если stdin использовалось для входных аргументов. И работает нормально, если аргументы были установлены с помощью командной строки.

Привет

...