我正在将一个CLI库从Ruby移植到Node.js。在我的代码中,必要时我会执行几个第三方二进制文件。我不确定如何在Node中实现这一点。

下面是Ruby中的一个示例,我调用PrinceXML将文件转换为PDF:

cmd = system("prince -v builds/pdf/book.html -o builds/pdf/book.pdf")

Node中的等效代码是什么?


当前回答

const exec = require("child_process").exec
exec("ls", (error, stdout, stderr) => {
 //do whatever here
})

其他回答

@六氰的答案几乎是完整的。在Windows命令prince可以是prince.exe、prince.cmd、prince.bat或prince(我不知道gems是如何绑定的,但npm bin附带了sh脚本和批处理脚本-npm和npm.cmd)。如果你想编写一个在Unix和Windows上运行的可移植脚本,你必须生成正确的可执行文件。

这里有一个简单但可移植的派生函数:

function spawn(cmd, args, opt) {
    var isWindows = /win/.test(process.platform);

    if ( isWindows ) {
        if ( !args ) args = [];
        args.unshift(cmd);
        args.unshift('/c');
        cmd = process.env.comspec;
    }

    return child_process.spawn(cmd, args, opt);
}

var cmd = spawn("prince", ["-v", "builds/pdf/book.html", "-o", "builds/pdf/book.pdf"])

// Use these props to get execution results:
// cmd.stdin;
// cmd.stdout;
// cmd.stderr;

由于版本4,最接近的替代方法是child_process.execSync方法:

const {execSync} = require('child_process');

let output = execSync('prince -v builds/pdf/book.html -o builds/pdf/book.pdf');

⚠️ 请注意,execSync调用会阻塞事件循环。

如果您不介意依赖关系,并且希望使用promise,那么子进程promise可以:

安装

npm install child-process-promise --save

exec用法

var exec = require('child-process-promise').exec;
 
exec('echo hello')
    .then(function (result) {
        var stdout = result.stdout;
        var stderr = result.stderr;
        console.log('stdout: ', stdout);
        console.log('stderr: ', stderr);
    })
    .catch(function (err) {
        console.error('ERROR: ', err);
    });

派生用法

var spawn = require('child-process-promise').spawn;
 
var promise = spawn('echo', ['hello']);
 
var childProcess = promise.childProcess;
 
console.log('[spawn] childProcess.pid: ', childProcess.pid);
childProcess.stdout.on('data', function (data) {
    console.log('[spawn] stdout: ', data.toString());
});
childProcess.stderr.on('data', function (data) {
    console.log('[spawn] stderr: ', data.toString());
});
 
promise.then(function () {
        console.log('[spawn] done!');
    })
    .catch(function (err) {
        console.error('[spawn] ERROR: ', err);
    });

ECMAScript模块导入。。。from语法

import {exec} from 'child-process-promise';
let result = await exec('echo hi');
console.log(result.stdout);

使用这个轻量级npm包:系统命令

看看这里。

按如下方式导入:

const system = require('system-commands')

运行以下命令:

system('ls').then(output => {
    console.log(output)
}).catch(error => {
    console.error(error)
})

现在,可以按如下方式使用shelljs(从节点v4):

var shell = require('shelljs');

shell.echo('hello world');
shell.exec('node --version');

使用安装

npm install shelljs

看见https://github.com/shelljs/shelljs