【问题标题】:Equivalent of Rake's 'sh' for Jake?相当于 Rake 对 Jake 的“sh”?
【发布时间】:2012-03-27 09:58:48
【问题描述】:

我对@9​​87654321@ 和Rake 有一些经验,但现在我正在处理一个Node 项目并想学习如何使用Jake 做同样的事情。

Ruby 有一个system 函数,它会输出一个命令并等待它退出。 Rake 通过添加一个 sh 函数扩展了这一点,如果子进程返回一个非零退出代码(或根本找不到),该函数将另外抛出一个错误。 sh 对于需要编译器或测试框架之类的 Rake 任务来说非常方便,因为它会在任何失败时自动终止任务。

Node 似乎没有 systemsh 之类的东西——看起来最接近的等价物是 child_process.spawnchild_process.exec,但它们都没有连接 STDOUT 或 STDERR,所以你可以'除非您做一些额外的工作,否则看不到子进程的任何输出。

为 Jake 获取 sh 方法的最佳方法是什么? (虽然这是 Node,我希望它是异步的,而不是像 Ruby 那样在命令返回之前阻塞。)是否有一个 npm 模块已经发明了这个特定的轮子,或者有人有一个代码示例这个?

我已经看过 sh.js,但它看起来非常重量级(它试图在 Node 中构建一个完整的命令解释器),而且它看起来不像是异步的(尽管文档没有说方式或其他方式)。

我正在寻找可以或多或少像这样使用的东西(使用 Jake 对 async tasks 的支持):

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);

【问题讨论】:

    标签: node.js jake


    【解决方案1】:

    这是我想出的一些代码,它似乎运行良好。 (但如果有人有更好的答案,或者知道现有的 npm 模块已经这样做了,请添加另一个答案。)

    • 支持完整的shell语法,因此您可以使用|<>来管道和重定向输出,您可以运行Windows批处理文件等。
    • 在子进程生成输出时显示输出(STDOUT 和 STDERR),因此您可以在命令运行时看到增量输出。
    • 对命令可以生成的输出量没有限制(与此代码以前基于exec 的版本不同)。
    • 跨平台(适用于 Windows,也应适用于 Mac/Linux)。我借用了特定于平台的shell (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();
      });
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-21
      相关资源
      最近更新 更多