【问题标题】:child_process.exec/spawn triggers callback/close with npm install command (via Gulp / Shipit)child_process.exec/spawn 使用 npm install 命令触发回调/关闭(通过 Gulp / Shipit)
【发布时间】: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


【解决方案1】:

我找到了解决办法!

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

因此,将命令更改为NODE_ENV=development npm install 似乎可以解决问题!

【讨论】:

    【解决方案2】:

    在更新 #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 上执行仅授予所有者用户/组,而我们的用户没有。我们可以通过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)

    更新: 在此question 之后,您的 tmp 文件夹可能也存在问题,但 npm 的调试文件夹可能存在问题。尝试搜索一个并检查权限。

    希望这是我们能遇到的所有选择。

    【讨论】:

    • /tmp 的权限:lrwxr-xr-x 1 root wheel
    • @TimKelty 这是只能写入 root/sudo 的符号链接,试试 ls -lLd /tmp
    • ls -lLd /tmp drwxr-xr-x 22 root wheel 748 May 11 07:44 /tmp
    • 为了避免整个权限问题,我将 tmp 位置更改为 ~/tmp/。仍然有问题。现在尝试解决方案 #2。
    • ls -lL $(which npm) -rwxr-xr-x 1 timkelty staff 1928 Feb 6 15:42 /Users/timkelty/.nvm/versions/node/v0.12.0/bin/npm
    猜你喜欢
    • 2020-02-27
    • 2021-08-17
    • 2019-09-30
    • 1970-01-01
    • 2021-09-11
    • 2016-08-18
    • 2019-06-26
    • 2020-06-23
    • 1970-01-01
    相关资源
    最近更新 更多