我正在调试docfx
工具的#448 issue
docfx.exe启动进程(wkthmltopdf),并使用输入流从stdin
流中设置wkthmltopdf参数。然后,它尝试从wkhtmltopdf
流中获取stdout
输出。
从控制台或作为WindowsService启动docfx时,它工作正常。
但是,如果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);
}
}
因此,从Azure构建管道启动docfx
时,将无法获得wkhtmltopdf
的输出。
_htmlToPdfOptions.IsReadArgsFromStdin = false;
此行经过硬编码,使其可以在Windows服务中使用。它更改了提供wkhtmltopdf
参数和不使用stdin
的方式。
在Azure Build管道中是否有任何变通办法将stdin
和stdout
用于同一过程?
我尝试使用process.StandardOutput.ReadToEnd();
,但是没有运气。如果将stdin
用作输入参数,它将返回空字符串。如果使用命令行设置了参数,则效果很好。
致谢