1

なぜこれがうまくいくのでしょうか:

var exec = require("child_process").exec;
var command = exec("grunt");

しかし、これはエラーをスローします:

var spawn = require("child_process").spawn;
var command = spawn("grunt");

それがスローするエラーはError: spawn ENOENT

最初は と関係があるのではないかと思っていましたがenv、両方ともまったく同じで、両方で機能 するため、 Grunt と何らかの関係があるに違いないと思いexecます。spawn.git

4

2 に答える 2

3

ノードのドキュメントを確認すると、次のspawnことがわかりました。

spawn が空のオプション オブジェクトを受け取った場合、process.env を使用するのではなく、空の環境でプロセスを生成することに注意してください。これは、非推奨の API との下位互換性の問題によるものです。

envin execのデフォルトのオプションは ですnullが、spawn の場合はprocess.envです。両方が同じになっている場合はあいまいenvですか?env両方に明示的に同じものを指定して、これを確認できますか。

于 2013-05-16T16:27:30.527 に答える
1

私は同じ問題を抱えています。Windows プラットフォームでのみ表示されます。そして最後に、この問題を解決するのに役立つこの問題を見つけました。

isaacs私は提案に従いました:

cmd は、プラットフォームに応じて「sh」または「cmd」のいずれかであり、arg は常に /c $cmd または -c $cmd のいずれかです。

child = child_process.spawnShell('util.bat glerp gorp', {options...})

これは砂糖になります:

child = child_process.spawn(isWin ? 'cmd' : 'sh', [isWin?'/c':'-c', arg], options)

次に、私は自分の簡単なを書きましたspawnShell

var spawn = require('child_process').spawn;    
function spawnShell(args,options){
    var isWin = (process.platform === 'win32');
    args.unshift(isWin ? '/c' : '-c');
    return spawn(isWin ? 'cmd' : 'sh', args, options);
}

少し遅くなりましたが、私の答えが将来誰かを助けることができることを願っています.

于 2014-08-17T15:13:15.880 に答える