【发布时间】:2015-07-11 09:27:29
【问题描述】:
- 我正在使用Shipit 进行部署。
- 部署时,Shipit 将当前 Git Sha 检出到 tmp 目录,然后我运行
npm install,然后运行 gulp build,然后继续部署。 - Shipit 将 Orchestrator 用于其任务流,就像 Gulp 一样。
- 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');
});
});
对应的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');
});
事情似乎解决了一个问题:它实际上并没有执行npm install!
Running "npm install --silent" on local.
Running "gulp build" on local.
因此,npm install 命令中的某些内容似乎过早地解决了承诺,但我不确定如何或为什么。
我在 npm 警告中遇到了类似的问题(仅使用 shipit cli),当时我发现使用 --silent arg 解决了这个问题。
作为测试,我将代码原样保留,但将 npm install --silent 替换为 sleep 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
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 命令似乎认为它没有要安装的任何依赖项,因此它没有错误地完成并继续我的下一个任务。
【问题讨论】:
-
你可以在没有
--silent的情况下使用npm install然后在console.log(res.stdout)中打印吗?和 console.log(res.stderr)? -
@vanadium23 在
child_process.exec回调中,stdout 和 stderr 都是空字符串:gist.github.com/4c0c905e2ab517806915 -
只是为了确保不是权限错误,您可以尝试将权限更改为 755 并运行脚本吗?
-
@vanadium23 当然可以,但是在什么路径上?我在运行
npm install命令的目录上做了chmod -R 755,结果相同。 -
睡了个好觉后我有了另一个想法。我们可以创建任务
echo "$(which npm) test" >> test.file而不是sleep 10。为什么需要它?首先我们知道 gulp 是否可以创建文件,其次我们知道 gulp 是否可以使用 npm 以及哪个。
标签: node.js promise gulp child-process