execa 跨平台子进程执行库的使用详解

29 min read

execa是一个跨平台的子进程执行库,它提供了比Node.js内置的child_process模块更多的功能,并且可以自动选择在Windows和其他操作系统上使用不同的实现方式。

使用execa非常简单,首先需要安装它:

npm install execa

然后就可以在代码中使用它了:

const execa = require('execa');

(async () => {
    const { stdout } = await execa('echo', ['hello', 'world']);
    console.log(stdout);
})();

上面的代码使用execa来执行一个简单的echo命令,并且传递了一些参数。它使用了async/await语法,以便在命令执行完成后打印命令的输出。

execa支持很多选项,其中包括:

  • cwd:设置当前工作目录
  • env:设置环境变量
  • shell:使用shell执行命令
  • timeout:设置命令的最大执行时间
  • input:向命令传递输入数据
  • stdio:重定向标准输入、输出和错误流

下面是一些使用这些选项的例子:

// 设置环境变量
await execa('my-command', [], {
    env: {
        NODE_ENV: 'production'
    }
});

// 使用shell执行命令
await execa('echo', ['hello', 'world'], {
    shell: true
});

// 设置命令的最大执行时间
await execa('long-running-command', [], {
    timeout: 5000
});

// 向命令传递输入数据
await execa('grep', ['hello'], {
    input: 'hello world\n'
});

// 重定向标准输入、输出和错误流
await execa('my-command', [], {
    stdio: 'inherit'
});

最后要注意的一个问题是,在Windows上使用execa执行一些非常规的命令会出现一些问题,例如执行一个bash脚本。为了避免这些问题,可以使用wsl.exe来运行bash脚本:

const { stdout } = await execa('wsl', ['bash', '/path/to/script.sh']);