node-sass安裝失敗的問題 stack Error: EACCES: permission denied, mkdir


最近在自己的項目中遇到了一個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

參考:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM