cross-spawn: 用于跨平台运行 shell 命令使用详解

35 min read

cross-spawn是一个用于跨平台运行Shell命令的Node.js模块。它在不同平台上提供一致的命令执行能力,解决了在Windows上使用child_process.spawn方法时可能遇到的一些问题。

cross-spawn的使用非常简单,只需要引入模块后调用它的方法即可。

下面是cross-spawn的基本用法:

// 引入cross-spawn模块
const spawn = require('cross-spawn');

// 执行shell命令
const ls = spawn('ls', ['-l'], { stdio: 'inherit' });

// 监听shell命令的退出事件
ls.on('exit', (code) => {
  console.log(`Child process exited with code ${code}`);
});

在上面的示例中,我们使用cross-spawn模块执行了一个ls命令,并传入了参数-l。通过stdio属性可以设置Shell命令的标准输入、输出和错误流的处理方式。在这个示例中,我们将stdio设置为inherit,表示与父进程共享标准输入、输出和错误流。

cross-spawn还提供了一些其他的功能,比如可以设置Shell命令的当前工作目录、环境变量等。下面是一个更复杂的示例:

const spawn = require('cross-spawn');

// 设置环境变量
const env = Object.create(process.env);
env.NODE_ENV = 'production';

// 执行Shell命令,并设置当前工作目录和环境变量
const child = spawn('npm', ['run', 'build'], {
  cwd: '/path/to/project',
  env
});

// 监听Shell命令的输出
child.stdout.on('data', (data) => {
  console.log(`stdout: ${data}`);
});

child.stderr.on('data', (data) => {
  console.error(`stderr: ${data}`);
});

// 监听Shell命令的退出事件
child.on('exit', (code) => {
  console.log(`Child process exited with code ${code}`);
});

在这个示例中,我们设置了一个环境变量NODE_ENV,并将其传递给Shell命令。我们还设置了当前工作目录cwd为"/path/to/project",这样Shell命令就会在指定的目录下执行。

除了基本的用法外,cross-spawn还提供了一些额外的功能,比如可以将Shell命令的输出流重定向到文件、设置超时时间等。详情可参考cross-spawn的文档。