在开发中常需要同时执行多个命令,
concurrently
的出现就是为了满足此类场景。
背景
作者喜欢使用 npm[1] 实现任务自动化,但同时运行多个命令的常用方法是 npm run watch-js & npm run watch-css
。使用 &
很好,却很难跟踪不同的输出。此外,如果一个进程失败,其他进程仍会继续运行,你也不会注意到其中的差异。另一种选择是在单独的终端中运行所有命令,但每个命令的运行都必须新开一个终端窗口更令人厌烦。
安装
因其使用 JS 编写,所以运行需要依赖 Node.js[2] 环境。
# 全局安装
npm i -g concurrently
# 项目中安装(-D: 开发依赖)
npm i -D concurrently复制
使用
命令使用帮助,以下列举了部分使用参数,查看文档了解更多 concurrently[3]:
concurrently -h
复制
concurrently 'echo "hello\n"' 'echo "world\n"' "git status"
复制
--raw (-r)
直接输出子进程:stdout + stderr:
concurrently --raw 'echo "hello\n"' 'echo "world\n"' "git status"
复制
--prefix (-p)
自定义前缀,日期格式请参考 date-fns[4]:
concurrently --prefix "{time}-{pid}" 'echo "hello\n"' 'echo "world\n"' "git status"
复制
--prefix-colors (-c)
自定义前缀颜色,颜色列表请参考 chalk[5]:
concurrently -c "bgBlue.bold,bgMagenta.bold" 'echo "hello\n"' 'echo "world\n"' "git status"
复制
自动改变前缀颜色:
concurrently -c auto --prefix "{time}-{pid}" 'echo "hello\n"' 'echo "world\n"' "git status"
复制
--names
自定义前缀名称
concurrently --names "HELLO,WORLD,GH" -c "auto" 'echo "hello\n"' 'echo "world\n"' "git status"
复制
名词解释
标准流 (Standard streams)[6] - 在 Unix 和类 Unix 系统中,如同某些编程语言接口一样,标准流是当一个计算机程序执行时,在它和它的环境间(一般指终端),事先连接的输入和输出频道。这三个
I/O
链接称作“标准输入”、“标准输出”和“标准错误输出”。标准输入 (stdin) - 指输入至程序的资料(通常是文件)。程序要求以读 (read) 操作来传输资料。并非所有程序都要求输入。如
dir
或ls
程序(显示一个目录中的文件名)运行时不用任何输入。除非被重导向 (redirection: 进程间通信的一种形式)
,否则输入一般从键盘获取。标准输出 (stdout) - 指程序写输出资料的流。程序要求资料传输使用写 (write) 的运算。并非所有程序都要求输出。如
mv
或ren
程序在成功完成时是沉默的。除非被重导向,否则输出一般是终端。标准错误输出 (stderr) - 另一输出流,用于输出错误消息或诊断。它独立于标准输出,且可以分别被重导。常见的目的则为启始这个程序的终端,即使其标准输出被重导亦如此。例如:一个流水线中的程序的输出被重导到下一个程序,但错误消息仍然直接流向文字终端。
References
npm: https://www.npmjs.com/
[2]Node.js: https://nodejs.org/
[3]concurrently: https://github.com/open-cli-tools/concurrently
[4]date-fns: https://date-fns.org/v2.0.1/docs/format
[5]chalk: https://github.com/chalk/chalk
[6]标准流 (Standard streams): https://en.wikipedia.org/wiki/Standard_streams