在 npm install bcrypt 时使用 mup deploy 部署流星应用程序时出错

Error when deploying a meteor app using mup deploy while npm install bcrypt

我在使用 mup deploy 部署 meteor 应用程序时出错,好吧,事实上,当我手动尝试使用 mup 生成的 Dockerfile 构建映像时,我也遇到了这个错误。

我想主要的错误信息(在日志输出下面的某处)是:

sh: 1: node-pre-gyp: 未找到

来自 docker build -t my-app:build . 的日志输出:

Removing intermediate container 3ac4d1150023
Step 7/7 : RUN cd  /built_app/programs/server &&     npm install --unsafe-perm
 ---> Running in 4a6faacefc21

> fibers@1.0.13 install /built_app/programs/server/node_modules/fibers
> node build.js || nodejs build.js

`linux-x64-v8-4.5` exists; testing
Binary is fine; exiting

> meteor-dev-bundle@0.0.0 install /built_app/programs/server
> node npm-rebuild.js


> bcrypt@0.8.6 install /built_app/programs/server/npm/node_modules/meteor/npm-bcrypt/node_modules/bcrypt
> node-gyp rebuild

make: Entering directory '/built_app/programs/server/npm/node_modules/meteor/npm-bcrypt/node_modules/bcrypt/build'
  CXX(target) Release/obj.target/bcrypt_lib/src/blowfish.o
  CXX(target) Release/obj.target/bcrypt_lib/src/bcrypt.o
  CXX(target) Release/obj.target/bcrypt_lib/src/bcrypt_node.o
  SOLINK_MODULE(target) Release/obj.target/bcrypt_lib.node
  COPY Release/bcrypt_lib.node
make: Leaving directory '/built_app/programs/server/npm/node_modules/meteor/npm-bcrypt/node_modules/bcrypt/build'
bcrypt@0.8.6 /built_app/programs/server/npm/node_modules/meteor/npm-bcrypt/node_modules/bcrypt
bindings@1.2.1 /built_app/programs/server/npm/node_modules/meteor/npm-bcrypt/node_modules/bcrypt/node_modules/bindings
nan@2.2.1 /built_app/programs/server/npm/node_modules/meteor/npm-bcrypt/node_modules/bcrypt/node_modules/nan

> bcrypt@1.0.3 install /built_app/programs/server/npm/node_modules/bcrypt
> node-pre-gyp install --fallback-to-build
sh: 1: node-pre-gyp: not found
npm ERR! file sh
npm ERR! code ELIFECYCLE
npm ERR! errno ENOENT
npm ERR! syscall spawn
npm ERR! bcrypt@1.0.3 install: `node-pre-gyp install --fallback-to-build`
npm ERR! spawn ENOENT
npm ERR!
npm ERR! Failed at the bcrypt@1.0.3 install script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR!     /root/.npm/_logs/2018-02-07T17_21_17_486Z-debug.log
npm WARN meteor-dev-bundle@0.0.0 No description
npm WARN meteor-dev-bundle@0.0.0 No repository field.
npm WARN meteor-dev-bundle@0.0.0 No license field.
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! meteor-dev-bundle@0.0.0 install: `node npm-rebuild.js`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the meteor-dev-bundle@0.0.0 install script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR!     /root/.npm/_logs/2018-02-07T17_21_17_559Z-debug.log
The command '/bin/sh -c cd  /built_app/programs/server &&     npm install --unsafe-perm' returned a non-zero code: 1

并且提到的日志文件说:

...
1227 info build /built_app/programs/server/npm/node_modules/bcrypt
1228 info lifecycle bcrypt@1.0.3~preinstall: bcrypt@1.0.3
1229 silly lifecycle bcrypt@1.0.3~preinstall: no script for preinstall, continuing
1230 info linkStuff bcrypt@1.0.3
1231 silly linkStuff bcrypt@1.0.3 has /built_app/programs/server/npm/node_modules as its parent node_modules
1232 verbose linkBins bcrypt@1.0.3
1233 verbose linkMans bcrypt@1.0.3
1234 verbose rebuildBundles bcrypt@1.0.3
1235 info lifecycle bcrypt@1.0.3~install: bcrypt@1.0.3
1236 verbose lifecycle bcrypt@1.0.3~install: unsafe-perm in lifecycle true
1237 verbose lifecycle bcrypt@1.0.3~install: PATH: /opt/nodejs/lib/node_modules/npm/bin/node-gyp-bin:/built_app/programs/server/npm/node_modules/bcrypt/node_modules/.bin:/built_app/programs/server/npm/node_modules/.bin:/opt/nodejs/bin:/opt/nodejs/lib/node_modules/npm/bin/node-gyp-bin:/built_app/programs/server/node_modules/.bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
1238 verbose lifecycle bcrypt@1.0.3~install: CWD: /built_app/programs/server/npm/node_modules/bcrypt
1239 silly lifecycle bcrypt@1.0.3~install: Args: [ '-c', 'node-pre-gyp install --fallback-to-build' ]
1240 info lifecycle bcrypt@1.0.3~install: Failed to exec install script
1241 verbose stack Error: bcrypt@1.0.3 install: `node-pre-gyp install --fallback-to-build`
1241 verbose stack spawn ENOENT
1241 verbose stack     at ChildProcess.<anonymous> (/opt/nodejs/lib/node_modules/npm/lib/utils/spawn.js:33:16)
1241 verbose stack     at emitTwo (events.js:87:13)
1241 verbose stack     at ChildProcess.emit (events.js:172:7)
1241 verbose stack     at maybeClose (internal/child_process.js:862:16)
1241 verbose stack     at Process.ChildProcess._handle.onexit (internal/child_process.js:222:5)
1242 verbose pkgid bcrypt@1.0.3
1243 verbose cwd /built_app/programs/server/npm
1244 verbose Linux 4.4.0-83-generic
1245 verbose argv "/opt/nodejs/bin/node" "/opt/nodejs/bin/npm" "rebuild"
1246 verbose node v4.8.7
1247 verbose npm  v4.6.1
1248 error file sh
1249 error code ELIFECYCLE
1250 error errno ENOENT
1251 error syscall spawn
1252 error bcrypt@1.0.3 install: `node-pre-gyp install --fallback-to-build`
1252 error spawn ENOENT
1253 error Failed at the bcrypt@1.0.3 install script.
1253 error This is probably not a problem with npm. There is likely additional logging output above.
1254 verbose exit [ 1, true ]

流星版本:1.4.4.2
节点版本:v4.8.7 npm 版本:4.6.1
mup版本:1.3.7
docker 图片:abernix/meteord:node-4.8.7-base

有什么想法...?
找不到哪个文件?
(而且,我很确定前一段时间完全相同的配置在工作...)
我非常感谢任何建议!

卸载bcrypt,你会看到警告,但对应用没有太大影响。

您的应用启动需要 node-pre-gyp 因为 bcrypt 包:

> bcrypt@1.0.3 install /built_app/programs/server/npm/node_modules/bcrypt

> node-pre-gyp install --fallback-to-build

但是,如果您仔细观察,您会注意到上面还安装了另一个版本的 bcrypt 并成功构建:

> bcrypt@0.8.6 install /built_app/programs/server/npm/node_modules/meteor/npm-bcrypt/node_modules/bcrypt

> node-gyp rebuild

根据安装路径,似乎 0.8.6 可能来自 Meteor Atmosphere 包 (npm-bcrypt),而 1.0.3 来自 package.json 依赖项。

因此,您可能应该首先尝试弄清楚为什么您有 2 个不同的 bcrypt 安装,以及您是否可以摆脱 1.0.3 版本。

在最有可能的情况下,由于 Meteor 的 accounts-password 包,您的应用程序依赖于 bcrypt,后者将自动使用 bcrypt 的 JavaScript 版本,如果它丢失了,因此您的应用程序不应通过简单地删除 npm 版本来中断:meteor npm uninstall --save bcrypt(如@AbhishekMaurya 所述)。但是,正如@AbhishekMaurya 的回答所述,应用程序启动日志将显示一条警告消息,提示 npm install bcrypt(您刚刚撤消)。当您的应用使用 bcrypt.

的 JavaScript 实现时,如果您接受性能的轻微下降,您可以接受该警告

至于现在的根本原因,a bug in Meteor 阻止了 node-pre-gypnpm 可见。这应该在 Meteor 版本 1.4.3.

中得到修复

如果没有,您可以尝试确保使用 bcrypt 的“旧”版本,如前所述 heremeteor npm install --save bcrypt@0.8.7