child_process.exec/spawn使用npm install命令触发回调/关闭(通过Gulp/Shipit)

Tim*_*lty 10 child-process node.js promise gulp

  • 我正在使用Shipit进行部署.
  • 在部署时,Shipit将当前的Git Sha检出到tmp目录,然后运行npm install后跟gulp build,然后继续部署.
  • 正如Gulp所做的那样,Shipit使用Orchestrator来完成它的任务流程.
  • Shipit拥有自己的CLI,因此我可以部署shipit development deploy.

以上所有事情都有效.我要做的是创建一个gulp deploy将直接初始化Shipit 的任务,而不是使用CLI.看起来像这样:

gulp.task('shipit:deploy', function() {
  var deployToEnv = argv['deploy-to'] || false;
  var shipit;
  return inquirer.prompt([{
    type: 'list',
    name: 'deployToEnv',
    default: deployToEnv,
    message: 'Deploy to environment:',
    choices: envs
  }]).then(function(answers) {
    deployToEnv = answers.deployToEnv;
    shipit = new Shipit({environment: deployToEnv});
    shipit.initialize();
    shipit.start('deploy');
  });
});
Run Code Online (Sandbox Code Playgroud)

对应的shipit配置:

  shipit.initConfig(config);
  shipit.blTask('build', function() {
    return shipit.local('npm install --silent', {
      cwd: shipit.config.workspace
    }).then(function() {
      return shipit.local('gulp build', {
        cwd: shipit.config.workspace
      });
    });
  });

  shipit.on('fetched', function() {
    shipit.start('build');
  });
Run Code Online (Sandbox Code Playgroud)

事情似乎与一个问题有关:它实际上并没有执行npm install!

Running "npm install --silent" on local. Running "gulp build" on local.

因此,npm install命令似乎过早地解决了承诺,但我不确定如何或为什么.

我有一个类似的问题(只使用shipit cli)和npm警告,这是我发现使用--silent arg解决了这个问题.

作为测试,我按原样保留了代码,但替换npm install --silentsleep 10.果然,它在执行前等了10秒钟gulp build.所以,它似乎是npm install命令的特定内容.

任何帮助表示赞赏!

更新#1:

shipit.local用途child_process.exec.我尝试将其转换为使用child_process.spawn,但结果相同.

更新#2:

如果我将命令更改为sudo npm install,则事情按预期工作!那么......这是什么意思,我怎么能避免用它来运行呢sudo

更新#3:

没有sudo仍然无法做到这一点,但我尝试添加--verbose这些结果的标志:

没有sudo:

@ npm info it worked if it ends with ok
@ npm verb cli [ '/Users/timkelty/.nvm/versions/node/v0.12.0/bin/node',
@ npm verb cli   '/Users/timkelty/.nvm/versions/node/v0.12.0/bin/npm',
@ npm verb cli   'install',
@ npm verb cli   '--verbose' ]
@ npm info using npm@2.5.1
@ npm info using node@v0.12.0
@ npm verb install where, deps [ '/Users/timkelty/tmp/edwards-garment-website', [] ]
@ npm verb install where, peers [ '/Users/timkelty/tmp/edwards-garment-website', [] ]
@ npm info preinstall edwards-garment-website@1.1.0
@ npm info build /Users/timkelty/tmp/edwards-garment-website
@ npm verb linkStuff [ false, false, false, '/Users/timkelty/tmp' ]
@ npm info linkStuff edwards-garment-website@1.1.0
@ npm verb linkBins edwards-garment-website@1.1.0
@ npm verb linkMans edwards-garment-website@1.1.0
@ npm verb rebuildBundles edwards-garment-website@1.1.0
@ npm info install edwards-garment-website@1.1.0
@ npm info postinstall edwards-garment-website@1.1.0
@ npm verb exit [ 0, true ]
@ npm info ok
Running "gulp build" on local.
@ [15:14:32] Local gulp not found in ~/tmp/edwards-garment-website
@ [15:14:32] Try running: npm install gulp
'build' errored after 755 ms
Error: Command failed: /bin/sh -c gulp build
Run Code Online (Sandbox Code Playgroud)

sudo:

Running "sudo npm install --verbose" on local.
@ npm info it worked if it ends with ok
@ npm verb cli [ '/Users/timkelty/.nvm/versions/node/v0.12.0/bin/node',
@ npm verb cli   '/Users/timkelty/.nvm/versions/node/v0.12.0/bin/npm',
@ npm verb cli   'install',
@ npm verb cli   '--verbose' ]
@ npm info using npm@2.5.1
@ npm info using node@v0.12.0
@ npm verb install where, deps [ '/Users/timkelty/tmp/edwards-garment-website',
@ npm verb install   [ 'Select2',
@ npm verb install     'autoprefixer-core',
@ npm verb install     'babel',
Run Code Online (Sandbox Code Playgroud)

...所以出于某种原因,当没有sudo运行时,npm install命令似乎认为它没有任何依赖安装,所以它完成没有错误并继续我的下一个任务.

Tim*_*lty 2

我找到了解决方案!

问题是我试图安装devDependencies,但是当我运行gulp deploy命令时,NODE_ENV 设置为生产,这不会安装 devDependency。

因此,将命令更改为NODE_ENV=development npm install似乎可以修复它!