使用node的脚本统一管理多个项目

发布时间 2023-03-30 14:41:40作者: 如戏一场

这里使用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命令不熟悉,还经常出错或者少些步骤,一下就解决了这些问题。
程序员总是想尽办法让自己可以更“懒”,“懒”使得社会进步,留下更多的时间去干别的事情(去学习怎么可以更懒)。