nodejs应用中调用系统命令、shell、python脚本

背景

fe/midway项目的scripts目录下有很多shell脚本,用来项目的测试、构建、部署。这样做极大提高了项目自动化,方便项目对接到jenkins上。那么问题来了。node应用中是如何调用shell、python脚本的。

实现

Nodejs子进程模块提供了运行系统命令(child_process.exec)以及运行脚本文件(child_process.execFile)的API,我们可以通过小实例来了解这两个API。

运行系统命令

示例代码

1
2
3
4
5
6
7
8
9
10
// child_process/exec.js
var exec = require('child_process').exec;
var cmdStr = 'echo "child_process exec"';
exec(cmdStr, function(err,stdout,stderr){
if(err) {
console.log('error:'+stderr);
} else {
console.log(stdout);
}
});

执行结果
exec.js

运行脚本文件

编写脚本 scripts/shell/test.sh

1
2
#!/bin/bash
echo "shell run in node app"

注意:
保存后一定要执行 chmod +x scripts/shell/test.sh ,将文件变成可执行文件

调用脚本

1
2
3
4
5
6
7
8
9
10
// execFile.js
var execFile = require('child_process').execFile;
var path = require('path');
execFile(path.join(__dirname, '../scripts/shell/test.sh'),function (err, stdout, stderr) {
if(err) {
console.log('error:'+stderr);
} else {
console.log(stdout);
}
});

执行结果
exec.js

提升

我们可以将上面的执行命令放入到package.json中的scripts下,下次运行的时候我们只要输入命令 npm run xxx就能满足我们的需求。
但项目脚本比较多的时候,我们就需要一个公共执行脚本工具,来统一管理和运行脚本。
scripty就是这样一个工具,让我们在项目中只要按照一定文件目录规律关注我们的脚本书写,以及按照固定格式写package.json文件中scripts的命令即可,不用我们去关注脚本如何去更平稳的调用。

使用步骤

安装依赖

1
npm install script --save-dev

具体使用

scripty使用的时候,脚本所在目录路径和命令之间关联,这样方便书写和管理对应脚本。

  • 首先在项目根目录下创建scripts文件夹
  • 如果想定义命令”npm run foo:far”,那么你要创建一个可执行bar.sh文件在项目的scripts/foo目录下
  • 在项目 package.json中的scripts中定义命令”foo:bar”: “scripty” 。(“scripty”是固定不变的)
  • 这样你就可以在项目中直接运行npm run foo:bar ,然后scripty依赖就会自动执行项目中scripts/foo/bar.sh脚本。

总结

1、系统命令、脚本都可以使用child_process模块提供的API来运行。
2、python 脚本的运行,可以使用exec(‘python yourPython.py arg1 arg2’, cb )。
3、使用scripty依赖,可以方便我们管理和维护项目的脚本。

参考文章:

Nodejs中调用系统命令、Shell脚本和Python脚本的方法和实例
child_process
scripty