我在Ruby和Rake方面有一些经验,但现在我正在开展一个Node项目,想要学习如何用{{3}做同样的事情}}
Ruby有一个Jake函数,它会弹出一个命令并等待它退出。 Rake通过添加system
函数来扩展它,如果子进程返回非零退出代码(或者根本找不到),则会另外抛出错误。 sh
对于Rake任务来说非常方便,因为它可以在编译器或测试框架之类的内容中使用它,因为它会在任何失败时自动终止任务。
节点似乎没有像system
或sh
这样的内容 - 看起来最接近的等价物是sh
和child_process.spawn
,但它们都没有连线STDOUT或STDERR,因此除非你做一些额外的工作,否则你看不到子进程的任何输出。
获取Jake sh
方法的最佳方法是什么? (虽然因为这是Node,我希望它是异步的,而不是阻塞,直到命令像Ruby一样返回。)是否有一个npm模块已经发明了这个特定的轮子,或者有人有一个代码样本做了此?
我已经看过child_process.exec
,但它看起来非常重量级(它试图在Node中构建一个完整的命令解释器),它看起来不像是异步(尽管文档没有说某种方式。)
我正在寻找一些我可以或多或少地使用的东西(使用Jake对sh.js的支持):
file('myprogram', ['in.c'], function() {
// sh(command, args, successCallback)
sh('gcc', ['in.c', '-o', 'myprogram'], function() {
// sh should throw if gcc couldn't be found or returned nonzero.
// So if we got here, we can tell Jake our task completed successfully.
complete();
});
}, true);
答案 0 :(得分:0)
以下是我提出的一些似乎运作良好的代码。 (但如果有人有更好的答案,或者知道现有的npm模块已经这样做了,请添加另一个答案。)
|
和<
以及>
来管道和重定向输出,您可以运行Windows批处理文件等。exec
的此代码版本不同)。if platform === 'win32'
)技术from npm。以下是代码:
function sh(command, callback) {
var shell = '/bin/sh', args = ['-c', commandLine], child;
if (process.platform === 'win32') {
shell = 'cmd';
args = ['/c', commandLine];
}
child = child_process.spawn(shell, args);
child.stdout.pipe(process.stdout);
child.stderr.pipe(process.stderr);
child.on('exit', function(code, signal) {
if (signal != null)
throw new Error("Process terminated with signal " + signal);
if (code !== 0)
throw new Error("Process exited with error code " + code);
callback();
});
};