如何在Go中将npm install进度条导向终端?

huangapple go评论121阅读模式
英文:

How to pipe npm install progress bar to the terminal in go?

问题

我已经尝试使用stdoutpipe和stderrpipe,如下所示。

  1. shell := exec.Command("npm", args...)
  2. shell.Dir = cwd
  3. outpipe, _ := shell.StdoutPipe()
  4. errpipe, _ := shell.StderrPipe()
  5. shell.Start()
  6. go func(pipe io.ReadCloser) {
  7. reader := bufio.NewReader(pipe)
  8. line, err := reader.ReadString('\n')
  9. for err == nil {
  10. fmt.Println(string(line))
  11. line, err = reader.ReadString('\n')
  12. }
  13. fmt.Println("exited")
  14. }(outpipe)
  15. go func(pipe io.ReadCloser) {
  16. reader := bufio.NewReader(pipe)
  17. line, err := reader.ReadString('\n')
  18. for err == nil {
  19. fmt.Println(string(line))
  20. line, err = reader.ReadString('\n')
  21. }
  22. fmt.Println("exited")
  23. }(errpipe)
  24. err := shell.Wait()
  25. if err != nil {
  26. fmt.Println(err)
  27. }

然而,我只得到以下输出:

  1. added 87 packages, and audited 88 packages in 3s
  2. 9 packages are looking for funding
  3. run `npm fund` for details
  4. found 0 vulnerabilities

我该如何获得在控制台运行npm install时显示的安装进度条?

我还尝试了以下解决方案,并在运行shell.run()后打印缓冲区,但它也给出了与上面相同的输出。

  1. shell := exec.Command(command, args...)
  2. shell.Dir = cwd
  3. var stderr, stdout bytes.Buffer
  4. shell.Stderr = &stderr
  5. shell.Stdout = &stdout
  6. return shell, &stdout, &stderr
英文:

I have tried using stdoutpipe and stderrpipe like shown below.

  1. shell := exec.Command("npm", args...)
  2. shell.Dir = cwd
  3. outpipe, _ := shell.StdoutPipe()
  4. errpipe, _ := shell.StderrPipe()
  5. shell.Start()
  6. go func(pipe io.ReadCloser) {
  7. reader := bufio.NewReader(pipe)
  8. line, err := reader.ReadString('\n')
  9. for err == nil {
  10. fmt.Println(string(line))
  11. line, err = reader.ReadString('\n')
  12. }
  13. fmt.Println("exited")
  14. }(outpipe)
  15. go func(pipe io.ReadCloser) {
  16. reader := bufio.NewReader(pipe)
  17. line, err := reader.ReadString('\n')
  18. for err == nil {
  19. fmt.Println(string(line))
  20. line, err = reader.ReadString('\n')
  21. }
  22. fmt.Println("exited")
  23. }(errpipe)
  24. err := shell.Wait()
  25. if err != nil {
  26. fmt.Println(err)
  27. }

However I only get output:

  1. added 87 packages, and audited 88 packages in 3s
  2. 9 packages are looking for funding
  3. run `npm fund` for details
  4. found 0 vulnerabilities

How do I get the installation progress bar that you get when you run npm install from the console?

I have also tried using a solution like below and printing the buffer after running shell.run() but it also gives the same output as the one above.

  1. shell := exec.Command(command, args...)
  2. shell.Dir = cwd
  3. var stderr, stdout bytes.Buffer
  4. shell.Stderr = &stderr
  5. shell.Stdout = &stdout
  6. return shell, &stdout, &stderr

答案1

得分: 1

已解决,感谢@Adrian的评论

cmd := exec.Command("npm", args...)
cmd.Dir = cwd

cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr

将输出重定向到os的标准输出和标准错误就是解决的关键。

英文:

Solved thanks @Adrian's comment

  1. cmd := exec.Command("npm", args...)
  2. cmd.Dir = cwd
  3. cmd.Stdout = os.Stdout
  4. cmd.Stderr = os.Stderr

Redirecting to os's stdout and stderr is what did the trick.

huangapple
  • 本文由 发表于 2022年11月15日 04:03:27
  • 转载请务必保留本文链接:https://go.coder-hub.com/74437218.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定