我有一个小的 Go 工具,它基本上允许用户定义一个命令,然后使用os/exec.
我的问题是我想向用户显示命令的输出(stdout/stderr)。
一个例子可能是这样的:用户定义了一个命令,最后是sh test.sh. test.sh 的内容:
echo "Start"
sleep 7s
echo "Done"
Run Code Online (Sandbox Code Playgroud)
使用我当前的实现,用户只能在完整命令完成后才能看到输出。在上面的示例中,用户在命令和第二个完成之前不会看到输出Start。sleepecho
我目前检索命令的输出是这样的:
cmd := exec.Command(command, args...)
cmd.Dir = dir
// Attach to the standard out to read what the command might print
stdout, err := cmd.StdoutPipe()
if err != nil {
log.Panic(err)
}
// Execute the command
if err := cmd.Start(); err != nil {
log.Panic(err)
}
buf := new(bytes.Buffer)
buf.ReadFrom(stdout)
log.Print(buf.String())
Run Code Online (Sandbox Code Playgroud)
是否有可能以某种方式实时读取 stdout/stderr 。这意味着一旦用户定义的命令创建并输出它就会被打印出来?
我正在使用dep来管理我正在编写的Go工具的依赖项.
此工具使用https://github.com/desertbit/grumble作为依赖项.这反过来使用https://github.com/chzyer/readline作为依赖.问题是,当我尝试运行我的工具时,我收到以下错误:
vendor/github.com/desertbit/grumble/app.go:295:20: unknown field 'HistorySearchFold' in struct literal of type readline.Config
我知道为什么会这样.grumble使用readline的master分支作为依赖.在这个领域是可用的.使用/ 不使用master时,1.4标签会被拉入vendor文件夹.HistorySearchFolddep initdep ensure
因此我的问题是:我如何强制dep拉取主分支呢?
我尝试在我的Gopkg.toml文件中添加以下内容:
[[constraint]]
branch = "master"
name = "github.com/chzyer/readline"
Run Code Online (Sandbox Code Playgroud)
可悲的是,这不起作用.当我检查拉入供应商文件夹的版本时,它仍然是1.4.