child_process.exec/spawn 使用 npm install 命令触发 callback/close(通过 Gulp / Shipit)
child_process.exec/spawn triggers callback/close with npm install command (via Gulp / Shipit)
- 我正在使用 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
命令中的某些内容过早地解决了承诺,但我不确定如何或为什么。
我有一个类似的问题(只是使用 shipit cli)和 npm 警告,当我发现使用 --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',
...所以出于某种原因,当 运行ning 没有 sudo 时,npm install 命令似乎认为它没有任何要安装的依赖项,所以它没有错误地完成并继续我的下一个任务。
更新#2 后,我有更多选项来写为什么这个组合不起作用/首先,我们需要弄清楚哪个用户执行命令。为此,您需要执行命令 whoami
并查看结果(您可以通过 ssh 或 shipit 任务来完成)。直接问题是什么权限没有用户安装包。
可能的解决方案#1:
用户没有 tmp 文件夹的权限。我们可以通过 ls -ld /path/to/tmp
检查它,预期输出:
drwxrwxrwt 13 root root 280 May 8 19:42 /tmp
您需要验证,所有用户都可以在 tmp 目录中写入:drwxrwxrwx。如果没有,可以通过chmod -R 755
.
设置
可能的解决方案#2:
在 npm
上执行仅授予所有者 user/group,而我们的用户没有。我们可以通过 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 的调试文件夹。尝试搜索一个并检查权限。
希望都是我们能遇到的选项
我找到了解决方案!
问题是我试图安装 devDependencies
,但是当我 运行 gulp deploy
命令时,NODE_ENV 被设置为生产,它没有安装devDependencies.
因此,将命令更改为 NODE_ENV=development npm install
似乎可以解决问题![=13=]
- 我正在使用 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
命令中的某些内容过早地解决了承诺,但我不确定如何或为什么。
我有一个类似的问题(只是使用 shipit cli)和 npm 警告,当我发现使用 --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',
...所以出于某种原因,当 运行ning 没有 sudo 时,npm install 命令似乎认为它没有任何要安装的依赖项,所以它没有错误地完成并继续我的下一个任务。
更新#2 后,我有更多选项来写为什么这个组合不起作用/首先,我们需要弄清楚哪个用户执行命令。为此,您需要执行命令 whoami
并查看结果(您可以通过 ssh 或 shipit 任务来完成)。直接问题是什么权限没有用户安装包。
可能的解决方案#1:
用户没有 tmp 文件夹的权限。我们可以通过 ls -ld /path/to/tmp
检查它,预期输出:
drwxrwxrwt 13 root root 280 May 8 19:42 /tmp
您需要验证,所有用户都可以在 tmp 目录中写入:drwxrwxrwx。如果没有,可以通过chmod -R 755
.
可能的解决方案#2:
在 npm
上执行仅授予所有者 user/group,而我们的用户没有。我们可以通过 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)
.
更新:
在此
希望都是我们能遇到的选项
我找到了解决方案!
问题是我试图安装 devDependencies
,但是当我 运行 gulp deploy
命令时,NODE_ENV 被设置为生产,它没有安装devDependencies.
因此,将命令更改为 NODE_ENV=development npm install
似乎可以解决问题![=13=]