Node JS - Grunt 任务中的 child_process spawn('npm install') 导致 ENOENT 错误

Posted

技术标签:

【中文标题】Node JS - Grunt 任务中的 child_process spawn(\'npm install\') 导致 ENOENT 错误【英文标题】:Node JS - child_process spawn('npm install') in Grunt task results in ENOENT errorNode JS - Grunt 任务中的 child_process spawn('npm install') 导致 ENOENT 错误 【发布时间】:2013-12-07 23:52:30 【问题描述】:

我在编写 Grunt 任务时遇到了一些困难。我正在尝试执行 npm install,然后是 bower install,然后是 grunt hub 目标(触发多个子项目的构建命令)。

我遇到的问题在于 child_process。如果我在我的 grunt 任务中运行以下命令,使用当前已注释掉的 npm install spawn 命令,我会收到 spawn ENOENT 错误:

    var path = require('path'),
        projectPath = path.resolve(process.cwd(), this.data.activity );

        grunt.log.debug('project path computed as: ', projectPath);
        process.chdir( projectPath );

        console.log('current dir is: ', process.cwd());
        console.log('EVN is: ', process.env);

        var spawnProcess = spawn('ls');
        // var spawnProcess = spawn('npm install');

        spawnProcess.stdout.on('data', function (data) 
            console.log('' + data);
        );

        spawnProcess.stderr.on('data', function(data) 

            console.log('something went wrong installing deps for ' + path + '.  Error: ', data);
        );

        spawnProcess.on('close', function (exitCode) 

            console.log( 'ls has finished with Exit Code: ' + exitCode);
        );

当前代码(使用 ls 而不是 npm install)导致:

   running "install:projects" (install) task[D] Task source: /Users/zedd45/proj/Gruntfile.js
Verifying property install.projects exists in config...OK
File: [no files]
[D] project path computed as:  /Users/zedd45/proj/activity/web/client
current dir is:  /Users/zedd45/proj/activity/web/client
EVN (abbreviated) is:   
   TERM_PROGRAM: 'iTerm.app',
   SHELL: '/bin/bash',
   PWD: '/Users/zedd45/proj',
 ...
  OLDPWD: '/Users/zedd45/proj/activity/web/client',
  _: '/usr/local/bin/grunt' 

GruntFile.js
bower.json
package.json
this_is_the_directory_you_are_looking_for.txt
ls has finished with Exit Code: 0

但如果我将 'ls' 更改为 'npm install' 我会得到 ``致命错误:生成 ENOENT

紧接着 ENV 打印。

我已经为那个目录尝试了 chmod 777,但这似乎没有帮助。

我也试过了:

// var spawnProcess = spawn('npm install', 'cwd': projectPath);

// var spawnProcess = spawn('npm install', [], 'cwd': projectPath);

前者的结果是

警告:对象 # 没有方法 'slice' 使用 --force 来 继续。

后者仍然会导致 ENOENT 错误。

任何关于这个 ENOENT 错误究竟是什么的帮助可能会有很大帮助;我在谷歌上搜索它和child process API docs

都没有取得太大的成功

【问题讨论】:

【参考方案1】:

再次检查 child_process.spawn 上的文档。第一个参数应该是only要运行的命令,第二个是参数:

var npm = spawn('npm', ['install'],  cwd: projectPath );

【讨论】:

效果很好。我无法相信一旦你提供了解决方案是多么容易/明显,或者它是多么难以逃避我。非常感谢! 供未来可能的访问者参考,***.com/questions/27688804/… 嗯,这对我不起作用。仍然获得 spawnSync npm ENOENT(是的,我正在使用同步版本) 在 Windows 上,您需要致电 npm.cmd

以上是关于Node JS - Grunt 任务中的 child_process spawn('npm install') 导致 ENOENT 错误的主要内容,如果未能解决你的问题,请参考以下文章

grunt简单教程

通过 Grunt 运行 Node 应用程序

在 Heroku 上运行 Grunt 构建任务

来自Webstorm的Grunt调试

高级前端以同步的方式运行 Gulp 任务和任务中的步骤

Grunt-学习。