child_process.exec / spawn使用npm install命令(通过Gulp / Shipit)触发callback/closures

  • 我正在使用Shipit进行部署。
  • 在部署时,Shipit将当前的Git Sha检查到一个tmp目录,然后运行npm install ,然后执行gulp build ,然后继续部署。
  • Shipit使用Orchestrator来完成任务stream程,就像Gulp一样。
  • Shipit有它自己的CLI,所以我可以使用shipit development deploy

上面的所有东西都起作 我想要做的是创build一个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'); }); }); 

相应的船舶configuration:

  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'); }); 

事情似乎有一个问题:它实际上并不执行npm install

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

所以,在npm install命令中,似乎有些东西过早地解决了这个问题,但是我不知道如何或者为什么。

我有一个类似的问题(只是使用船舶cli)与npm警告,这是当我发现使用 – 无声ARG解决了这一点。

作为一个testing,我离开了代码,但用sleep 10取代了npm install --silent sleep 10 。 果然,在执行gulp build之前等了10秒钟。 所以,这似乎是用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 

随着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', 

…所以出于某种原因,在没有使用sudo的情况下运行时,npm install命令似乎认为它没有任何依赖性来安装,所以它完成没有错误,并继续我的下一个任务。

我find了解决scheme!

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

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

更新#2后,我有更多的select来写为什么这个组合不起作用/首先,我们需要找出哪个用户执行命令。 要做到这一点,你需要执行命令whoami并看到结果(你可以通过ssh或shipit任务)。 直接的问题是什么priveleges没有用户安装包。

可能的解决scheme#1:

用户对tmp文件夹没有权限。 我们可以通过ls -ld /path/to/tmp检查它,预期输出:

 drwxrwxrwt 13 root root 280 May 8 19:42 /tmp 

您需要validation,所有用户都可以在tmp目录中写入:drwxrwxrwx。 如果没有,可以通过chmod -R 755进行设置。

可能的解决scheme#2:

npm上执行只在所有者用户/组上授予,而我们的用户没有。 我们可以通过ls -lL $(which npm)来检查它。 预期产出:

 -rwxr-xr-x 1 root root 1881 Apr 19 07:12 /usr/../lib/node_modules/npm/bin/npm-cli.js 

如果文件没有权限x,则执行sudo chmod +x $(which npm)

更新:在这个问题之后可能还有问题不是你的tmp文件夹,而是npm的debugging文件夹。 尝试search一个&检查权限。

希望这是我们可以遇到的所有选项。