执行命令和流结果

Lin*_*nus 6 elixir

我想执行系统命令(git clone)并通过Phoenix中的通道将输出流式传输给用户?

我可以以某种方式使System.cmd流结果而不是等到它完成?

或者,我可以将输出写入文件并从那里流式传输内容,因为它正在追加?

sob*_*evn 3

可以通过以下方式覆盖输出:

System.cmd "git", ["clone", "YOUR_GIT"], into: IO.stream(:stdio, :line)
Run Code Online (Sandbox Code Playgroud)

结果:

克隆到“YOUR_GIT”...远程:计数对象:1665,完成。远程:压缩对象:0% (1/979) 远程:压缩对象:100% (979/979),完成。接收对象:0%(1/166远程:总计 1665 个(增量 855),重用 1331 个(增量 597) 接收对象:92%(接收对象:100%(1665/1665),5.25 MiB | 376.00 KiB/s,完成。正在解析 delResolving 增量:100% (855/855),完成。检查连接...完成。
{%IO.Stream{device: :standard_io, line_or_bytes: :line, raw: false}, 0}

文档

编辑:

为了帮助您完成特定任务,将本地标准流重定向到外部标准流,有一个瓷器库可以完美地处理它

  • sobolevn:它似乎不起作用:尝试这个 System.cmd("git", ["clone", "--progress", git_uri, "docker-test"], stderr_to_stdout: true, into: IO.stream( :stdio, :line)) |> Stream.map(fn(line) -> IO.inspect("FOO") end) IO.inspect("FOO") 永远不会被调用。一切都只是打印为标准输出。我想将每一行捕获为流并将其在 Phoenix 通道中发送给客户端。 (2认同)