最近在自己的項目中遇到了一個node-sass 包安裝的問題,問題如下
當我 sudo npm i
會出現下面這段錯誤信息,我試了修改權限和修改包的版本后還是沒有能夠解決,最后google 終於解決了,這里記下問題的原因和解決辦法
gyp verb build dir attempting to create "build" dir: /工作:學習/github/react-view/node_modules/node-sass/build
gyp ERR! configure error
gyp ERR! stack Error: EACCES: permission denied, mkdir '/工作:學習/github/react-view/node_modules/node-sass/build'
gyp ERR! System Darwin 17.7.0
gyp ERR! command "/usr/local/bin/node" "/工作:學習/github/react-view/node_modules/node-gyp/bin/node-gyp.js" "rebuild" "--verbose" "--libsass_ext=" "--libsass_cflags=" "--libsass_ldflags=" "--libsass_library="
gyp ERR! cwd /工作:學習/github/react-view/node_modules/node-sass
gyp ERR! node -v v10.15.3
gyp ERR! node-gyp -v v3.8.0
gyp ERR! not ok
首先造成這個問題的原因是:
npm會有生命周期,某個包會有生命周期來執行一些東西,安全起見會自動降級導致沒有權限執行一些操作,通過--unsafe-perm參數來解鎖該限制。
npm lifecycle 命令在執行前,會判斷配置unsafe-perm為true 時才繼續,否則會提前退出。
// lib/utils/lifecycle.js
unsafe = unsafe || npm.config.get('unsafe-perm')
if ((wd.indexOf(npm.dir) !== 0 || _incorrectWorkingDirectory(wd, pkg)) && !unsafe && pkg.scripts[stage]) {
log.warn('lifecycle', logid(pkg, stage), 'cannot run in wd',
'%s %s (wd=%s)', pkg._id, pkg.scripts[stage], wd
)
return cb()
}
配置的讀取順序大致參考:npm-config,即cli -> env -> npmrc -> default。
default中關於unsafe-perm的初始化如下:
// lib/config/defaults.js
'unsafe-perm': process.platform === 'win32' ||
process.platform === 'cygwin' ||
!(process.getuid && process.setuid &&
process.getgid && process.setgid) ||
process.getuid() !== 0
針對unix 平台,使用root 用戶執行npm 命令時得到的默認值都會是false。
解決辦法:
- 安裝時臨時修改npm配置 sudo npm install --unsafe-perm
- 設置項目中npm的默認配置 npm config set unsafe-perm=true
- 在項目中創建.npmrc來覆蓋default的配置
// .npmrc
unsafe-perm = true
- 全局設置 npm config -g set unsafe-perm
- 這里就需要修改node目錄的權限為root
chown root:root node
- npm提供的解決方案
## 創建.npm-global目錄
mkdir ~/.npm-global
## 設置
npm config set prefix '~/.npm-global'
export PATH=~/.npm-global/bin:$PATH
source ~/.profile
參考: