2013-10-17 41 views
2

我搜索了很多,但沒有得到正確的答案。產生子進程在nodejs中調用npm-installed命令導致窗口中ENOENT

首先,我敢肯定,該命令是命令行下使用,這裏是輸出:

> lessc 
lessc: no input files 

usage: lessc [option option=parameter ...] <source> [destination] 

然而,當使用child_process.spawn,我得到:

> node test.js 
Encountered error: { [Error: spawn ENOENT] code: 'ENOENT', errno: 'ENOENT', syscall: 'spawn' } 

我敢肯定,process.env給予spawn,這裏是代碼的NodeJS:

var build = require('child_process').spawn(
    'lessc', 
    [], 
    { 
     stdio: 'inherit', 
     env: process.env 
    } 
); 

build.on(
    'error', 
    function (err) { 
     console.log('Encountered error:', err); 
     process.exit(); 
    } 
); 
build.on(
    'close', 
    function (err) { 
     console.log('close'); 
    } 
); 

而且weiredly,只遇到ENOENT當通過npm install -g安裝命令,它運作良好,在例如dirdel系統命令

+0

它適用於我在Linux上,將盡快在Windows上測試。同時,我建議你檢查你的PATH:是否可能是'cmd'窗口設置了一個路徑(比如你正在運行的'.bat'文件),這對於衍生進程是不存在的?另外,'dir'和'del'是內部的'cmd'命令,所以「不計數」(它們工作的事實)。嘗試運行一個外部'.exe'來查看它是否工作。最後,你不需要指定'env:process.env',這是默認的。 –

回答

2

因爲是事實證明,以下工作:

var spawn = require('child_process').spawn; 

var b = spawn(
    process.env.comspec, 
    ['/c', 'lessc'], 
    { stdio: 'inherit' } 
); 

注您不需要像那樣明確地通過env,默認是繼承。

+0

我試過不通過'env',它仍然失敗,它在OSX和Linux中可用,但在Windows cmd中失敗 – otakustay

+0

您是否嘗試過這種解決方案? –

+0

嘗試過'process.env.comspec'後,它可以工作,但是我還有2個問題:在每臺Windows計算機上使用'/ c'作爲第一個參數會保存嗎?爲什麼'comspec'工作,但直接產卵失敗,他們之間有什麼不同(我已經注意到'process.env.comspec'是'cmd'命令)? – otakustay