34

続いて(Windows 7では、透過的にインストールされspawnたCygWinのおかげでn xコマンド。すべてのn xコマンドはコマンドラインでうまく解決されます)。rm -rf node_modulesnpm install

最初は を使用していexecましたが、発生した stdout/stderr 情報をキャッチしたかったので、 を使用しspawn、それを使用するようにコードを書き直しました。しかし、それはすべてを壊します。

書き直されたrmコマンドは次のようになりました。

var spawn = require("child_process").spawn,
    child = spawn("rm", ["-rf", "node_modules"]);
child.stdout.on('data', function (data) { console.log(data.toString()); });
child.stderr.on('data', function (data) { console.log(data.toString()); });
child.on('error', function() { console.log(arguments); });

ただし、これを実行すると、次のエラーが発生します。

rm: unknown option -- ,

Try `rm --help' for more information.

書き直されたnpmコマンドは次のようになりました。

var spawn = require("child_process").spawn,
    child = spawn("npm", ["install"]);
child.stdout.on('data', function (data) { console.log(data.toString()); });
child.stderr.on('data', function (data) { console.log(data.toString()); });
child.on('error', function() { console.log(arguments); });

ただし、これを実行すると、次のエラーが発生します。

{
  '0': {
    [Error: spawn ENOENT]
    code: 'ENOENT',
    errno: 'ENOENT',
    syscall: 'spawn'
  }
}

execあちこちでエラーをスローすることなく、正常に機能した同じコマンドをspawnに実行させるにはどうすればよいですか? そして、なぜこれが機能しないのですか?API http://nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_optionsを読むと、これがまさにスポーンの使用方法であることが示唆されているようです...

4

3 に答える 3

-1

これはある種の cygwin の落とし穴かもしれないと思います。私は Ubuntu 12.04 を実行しており、問題を再現しようとしましたが、問題なく動作します。要するに、私はあなたが間違っていることは何も見ていません。

オプションについて不満がある場合は、次のように複数のオプションに分割してください。

child = spawn("rm", ["-r", "-f", "node_modules"]);

それは一種の雹のマリアですが、それは私のUbuntu 12.04でも機能します。単一のファイルを削除して、同じ結果になるかどうかを確認してみてください。

child = spawn("rm", ["/home/username/Desktop/TestFile"]);

それでも失敗する場合は、クレイジーなものに取り組んでいることがわかります.

次のように、パラメーターを指定せずにコマンドを実行することもできます。

child = spawn("ls");

それでも失敗する場合は、スポーンがまったく機能しない可能性が高く、少なくとも exec が機能していることに感謝します。

あなたにとって答えの領域にはあまりありませんが、私が言ったように、あなたが間違っていることは何もわかりません.

さらに、何をインストールするかを指定していないため、npmコマンドがどのように機能するかわかりませんが、同じコマンドを使用すると、ここで失敗するのとは異なる方法で失敗します. . . 全体的なエラーではなく、多くの stderr 出力が表示されます。

ところで、ノード v0.8.21 を実行しています。node -v でクエリできます。別のバージョンを実行している場合は、0.8.21 を試してみてください。

于 2013-07-08T20:42:08.953 に答える
-2

次のように、プロセスのフル パスを使用します。

var cmd = require('child_process').spawn("C:\\windows\\system32\\cmd.exe");
于 2015-03-09T10:39:21.023 に答える