使用node的脚本统一管理多个项目
这里使用nodejs的child_process模块来执行命令行
1、背景
开发项目时有客户端项目,后台项目,后端的接口三个项目。每次做修改时有可能同时修改了几个项目,若每次修改后都手动打包,并上传到服务器,步骤多且重复,所以就想着应该能通过一个脚本,实现自动跑所有的命令,只需要执行某一个命令即可完成所有的步骤。
2、实现过程
最开始想的是通过bash实现一个脚本,自动跑所有的命令(是可行的)。但是由于本人是前端开发,比较少接触bash,去学习了半天感觉语法有点不符合前端气质,于是就去node中找是否有执行命令行的方法,果然就被找到了child_process模块。
3、child_process模块基本介绍
该模块有exec、spawn、fork、execFile等方法来开启一个新的进程,具体使用可以参看node官网
4、这里我使用了exec方法
基本用法
exec(commend, (error, stdout, stderr) => {})
// 例如需要执行 ls (查看目录中的文件或文件夹)命令
exec('ls', (error, stdout, stderr) => {
if (error) {
console.error('执行命令出错了')
} else {
console.log(stdout) // 执行命令的标准输出
console.log(stderr) // 执行命令的错误输出
}
})
// 多个命令结合执行,例如需要查看 当前目录下demo文件夹下的列表
exec('cd demo && ls', (error, stdout, stderr) => {
if (error) {
console.error('执行命令出错了')
} else {
console.log(stdout) // 执行命令的标准输出
console.log(stderr) // 执行命令的错误输出
}
})
利用该方法就可以将多个命令一次性执行完,由于有三个项目,可以分别写三个需要处理的流程,下面是我使用的示例
const { exec } = require('child_process')
const baseDir = __dirname
main()
async function main() {
await buildAndPush('server')
await buildAndPush('backend')
await buildAndPush('frontend')
}
async function buildAndPush(name) {
console.log(`start ${name}--------------------------------------------------------------------`)
const { stdout, stderr } = await asyncExec(`
cd ${baseDir}/${name} &&
git push origin &&
npm run build &&
tar -zcvf dist.tar.gz dist &&
`) // 后续还可以实现自己的逻辑,比如直接将打包后的文件推送到服务器
console.log(`end ${name}--------------------------------------------------------------------`)
console.log(`${name} stdout: `, stdout)
console.log(`${name} stderr: `, stderr)
}
function asyncExec(commend) {
return new Promise((resolve, reject) => {
exec(commend, (error, stdout, stderr) => {
if (error) {
reject(error)
} else {
resolve({ stdout, stderr })
}
}) // ignore_security_alert_wait_for_fix RCE
})
}
5、总结
使用该方法后写完代码,少执行好多步骤,坐着看个电视等他跑完就好了,本来就对bash命令不熟悉,还经常出错或者少些步骤,一下就解决了这些问题。
程序员总是想尽办法让自己可以更“懒”,“懒”使得社会进步,留下更多的时间去干别的事情(去学习怎么可以更懒)。