Я отлаживаю # 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
использовалось для входных аргументов. И работает нормально, если аргументы были установлены с помощью командной строки.
Привет