環境說明
ganiks@ganiks-ubuntu-trusty-64:/ganiks/parse-server$ npm -v 6.5.0 ganiks@ganiks-ubuntu-trusty-64:/ganiks/parse-server$ node -v v10.15.0
問題描述
安裝部署 ParseServer服務
root@ganiks-ubuntu-trusty-64:/ganiks/parse-server# npm install -g parse-server mongodb-runner
遇到了第一個異常
> bcrypt@3.0.3 install /usr/local/lib/node_modules/bcrypt > node-pre-gyp install --fallback-to-build node-pre-gyp WARN Using needle for node-pre-gyp https download node-pre-gyp WARN Pre-built binaries not installable for bcrypt@3.0.3 and node@10.15.0 (node-v64 ABI, glibc) (falling back to source compile with node-gyp) node-pre-gyp WARN Hit error EACCES: permission denied, mkdir '/usr/local/lib/node_modules/bcrypt/lib' gyp WARN EACCES user "root" does not have permission to access the dev dir "/root/.node-gyp/10.15.0" gyp WARN EACCES attempting to reinstall using temporary dev dir "/usr/local/lib/node_modules/bcrypt/.node-gyp" gyp WARN install got an error, rolling back install
完整的Error信息:
> bcrypt@3.0.3 install /usr/local/lib/node_modules/bcrypt > node-pre-gyp install --fallback-to-build node-pre-gyp WARN Using needle for node-pre-gyp https download node-pre-gyp WARN Pre-built binaries not installable for bcrypt@3.0.3 and node@10.15.0 (node-v64 ABI, glibc) (falling back to source compile with node-gyp) node-pre-gyp WARN Hit error EACCES: permission denied, mkdir '/usr/local/lib/node_modules/bcrypt/lib' gyp WARN EACCES user "root" does not have permission to access the dev dir "/root/.node-gyp/10.15.0" gyp WARN EACCES attempting to reinstall using temporary dev dir "/usr/local/lib/node_modules/bcrypt/.node-gyp" gyp WARN install got an error, rolling back install gyp WARN install got an error, rolling back install gyp ERR! configure error gyp ERR! stack Error: EACCES: permission denied, mkdir '/usr/local/lib/node_modules/bcrypt/.node-gyp' gyp ERR! System Linux 3.13.0-164-generic gyp ERR! command "/usr/local/bin/node" "/usr/local/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js" "configure" "--fallback-to-build" "--module=/usr/local/lib/node_modules/bcrypt/lib/binding/bcrypt_lib.node" "--module_name=bcrypt_lib" "--module_path=/usr/local/lib/node_modules/bcrypt/lib/binding" "--napi_version=3" "--node_abi_napi=napi" "--napi_build_version=0" "--node_napi_label=node-v64" gyp ERR! cwd /usr/local/lib/node_modules/bcrypt gyp ERR! node -v v10.15.0 gyp ERR! node-gyp -v v3.8.0 gyp ERR! not ok node-pre-gyp ERR! build error node-pre-gyp ERR! stack Error: Failed to execute '/usr/local/bin/node /usr/local/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js configure --fallback-to-build --module=/usr/local/lib/node_modules/bcrypt/lib/binding/bcrypt_lib.node --module_name=bcrypt_lib --module_path=/usr/local/lib/node_modules/bcrypt/lib/binding --napi_version=3 --node_abi_napi=napi --napi_build_version=0 --node_napi_label=node-v64' (1) node-pre-gyp ERR! stack at ChildProcess.<anonymous> (/usr/local/lib/node_modules/bcrypt/node_modules/node-pre-gyp/lib/util/compile.js:83:29) node-pre-gyp ERR! stack at ChildProcess.emit (events.js:182:13) node-pre-gyp ERR! stack at maybeClose (internal/child_process.js:962:16) node-pre-gyp ERR! stack at Process.ChildProcess._handle.onexit (internal/child_process.js:251:5) node-pre-gyp ERR! System Linux 3.13.0-164-generic node-pre-gyp ERR! command "/usr/local/bin/node" "/usr/local/lib/node_modules/bcrypt/node_modules/.bin/node-pre-gyp" "install" "--fallback-to-build" node-pre-gyp ERR! cwd /usr/local/lib/node_modules/bcrypt node-pre-gyp ERR! node -v v10.15.0 node-pre-gyp ERR! node-pre-gyp -v v0.12.0 node-pre-gyp ERR! not ok Failed to execute '/usr/local/bin/node /usr/local/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js configure --fallback-to-build --module=/usr/local/lib/node_modules/bcrypt/lib/binding/bcrypt_lib.node --module_name=bcrypt_lib --module_path=/usr/local/lib/node_modules/bcrypt/lib/binding --napi_version=3 --node_abi_napi=napi --napi_build_version=0 --node_napi_label=node-v64' (1) npm ERR! code ELIFECYCLE npm ERR! errno 1 npm ERR! bcrypt@3.0.3 install: `node-pre-gyp install --fallback-to-build` npm ERR! Exit status 1 npm ERR! npm ERR! Failed at the bcrypt@3.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/2019-01-17T08_54_06_070Z-debug.log
解決方案
npm install 添加參數 --unsafe-perm
root@ganiks-ubuntu-trusty-64:/ganiks/parse-server# sudo npm install -g parse-server mongodb-runner --unsafe-perm
參考資料
https://github.com/nodejs/node-gyp/issues/454
https://github.com/nfarina/homebridge/issues/405#issuecomment-164803485
If npm detects it is running as root it drops to a non-privileged user which then doesn't have permissions to write to
/root/.node-gyp
.The --unsafe-perm option stops it from changing user.
nvm doesn't have this problem when not using sudo because it stores everything under the current users' home directory.
https://docs.npmjs.com/misc/config#unsafe-perm--unsafe-perm
看官方文檔的解釋
unsafe-perm
Default: false if running as root, true otherwise
Type: Boolean
Set to true to suppress the UID/GID switching when running package scripts.If set explicitly to false, then installing as a non-root user will fail.
補充
parse-server沒必要全局的安裝(-g),安裝到本地目錄,就不會遇到本文的問題。
更新於2019.01.19 14:15
vagrant@ganiks-ubuntu-trusty-64:~/parse-server-advanced$ npm install parse-server npm WARN deprecated uws@10.148.1: stop using this version > bcrypt@3.0.3 install /home/vagrant/parse-server-advanced/node_modules/bcrypt > node-pre-gyp install --fallback-to-build node-pre-gyp WARN Using request for node-pre-gyp https download [bcrypt] Success: "/home/vagrant/parse-server-advanced/node_modules/bcrypt/lib/binding/bcrypt_lib.node" is installed via remote > parse-server@3.1.3 postinstall /home/vagrant/parse-server-advanced/node_modules/parse-server > node -p 'require("./postinstall.js")()' 1111111111 1111111111111111 1111111111111111111111 11111111111111111111111111 111111111111111 11111111 1111111111111 111111 1111111111111 111111111 111111 111111111111 11111111111 111111 1111111111111 11111111111 111111 1111111111111 1111111111 111111 1111111111111111111111111 1111111 11111111 11111111 111111 1111111111111111111 11111 11111 111111111111111111 11111 11111111111111111 111111 111111111111111111 11111111111111111111111111 1111111111111111111111 111111111111111111 11111111111 Thanks for installing parse 🙏 Please consider donating to our open collective to help us maintain this package. 👉 https://opencollective.com/parse-server added 356 packages from 381 contributors in 51.675s