2017-07-08 2 views
0

Ich verwende diesen Code:NodeJs Skript mit Child_Process Spawn auf Windows, warum brauche ich 'Shell: True' für ENOENT Fehler?

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

let info = spawn('npm', ["-v"]); 

info.on('close',() => { 
    console.log('closed'); 
} 

Aber ich habe diesen Fehler:

events.js:182 
     throw er; // Unhandled 'error' event 
    ^

Error: spawn npm ENOENT 
    at exports._errnoException (util.js:1022:11) 
    at Process.ChildProcess._handle.onexit (internal/child_process.js:189:19) 
    at onErrorNT (internal/child_process.js:366:16) 
    at _combinedTickCallback (internal/process/next_tick.js:102:11) 
    at process._tickCallback (internal/process/next_tick.js:161:9) 
    at Function.Module.runMain (module.js:607:11) 
    at startup (bootstrap_node.js:158:16) 
    at bootstrap_node.js:575:3 

Wenn ich statt:

let info = spawn('npm', ["-v"], {shell: true}); 

es funktioniert!

Aber warum brauche ich shell: true? Ich brauche auch die stdout dieses Laich, um zu sehen, also verwende ich auch dies:

let info = spawn('npm', ["-v"], {shell: true, stdio: 'inherit'}); 

Es ist richtig?

Antwort

1

Beim Aufruf von spawn selbst gibt es keinen npm Befehl unter spawn. Also hast du diese Fehlermeldung bekommen. Anstatt spawn selbst zu verwenden, wird spawn shell Ihres Systems verwenden, um diesen Befehl auszuführen, während shell: true hinzugefügt wird. Da Ihr System npm hat, funktioniert es.

Der Code ist in Ordnung, wenn Ihre Parameter der Spawn kontrollierbar sind. Aber im Allgemeinen schlage ich vor, pure Spawn ohne Shell zu verwenden. Das Risiko wird reduziert, ohne Shell direkt zu berühren.


Da brauchen Sie die Stream-Rückkehr von Spawn. Ich habe andere Lösung here überprüft. Without shell: true, können Sie den Code verwenden:

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

let projectPath = ''//the path of your project 
let info = spawn('npm', ['-v'], { cwd: projectPath }); 

let result = ''; 
info.stdout.on('data', function(data) { 
    result += data.toString(); 
    console.log(result); 
} 
+0

Ja, natürlich, aber ich brauche die stdout „lebt“ nicht am Ende meiner Befehle. Wie mit der Exekutive? –

+0

Ich habe Ihren Grund der Verwendung von Spawn, haben Sie versucht, cwd als Parameter? Ich habe den Code aktualisiert. Bitte versuchen Sie es. –

+0

Funktioniert nicht auf Windows die cwd. Ich habe jeden Pfadmodus ausprobiert: Absolut, Relativ, Rückwärts und Vorwärts Schrägstrich. Nichts. –

Verwandte Themen