npm install 报错 Error: EPERM: operation not permitted, rename
作者:mmseoamin日期:2024-02-20

报错的解决方案

  • 原因1: 权限不足
  • 原因2:缓存出错
    • 方法1
    • 方法2
    • 原因3:npm版本不够
    • 原因4:网络不稳定
      • 方法1
      • 方法2
      • 原因5: 杀毒软件问题
        • 方法1
        • 方法2
        • 其他:待补充

          原因1: 权限不足

          用管理员身份打开终端再执行命令

          原因2:缓存出错

          方法1

          1. 删除C:\Users{账户}\下的.npmrc文件
          2. 删除node_modules文件夹
          3. 执行命令npm cache clean -f
          4. 然后执行安装命令

          方法2

          1. 删除node_modules文件夹
          2. 执行命令npm cache clean -f
          3. 重启电脑
          4. 再次执行安装命令

          原因3:npm版本不够

          1. 执行npm install npm@6.0.0
          2. 执行安装命令

          原因4:网络不稳定

          方法1

          1. 切换npm的下载源:npm config set registry https://registry.npm.taobao.org
          2. 检查当前下载源:npm config get registry,如果结果是上面的这个淘宝源,就切换成功了
          3. 再次执行安装命令

          方法2

          1. 在安装命令后面加上--registry https://registry.npm.taobao.org

          附上官方源地址: registry https://registry.npmjs.org/

          原因5: 杀毒软件问题

          方法1

          关闭杀毒软件,然后再运行几次这个安装命令

          方法2

          1. 找到该文件:[NODE_HOME]/node_modules/npm/node_modules/graceful_fs/polyfills.js
          2. 在其中查找以下内容:
          if (process.platform === "win32") {
          //或者是
          if (platform === "win32") {
          
          1. 在找到的位置的下面,修改文件为
          /*
          说明:
          在这个语句中,有一个超时,在出现错误时进行重试。
          问题是,在某些情况下,在超时之后,文件仍然被A/V锁定。
          解决方案是去掉超时并让这个语句循环。对先前代码的更改进行了注释:
          */
          if (platform === "win32") {
          fs.rename = (function (fs$rename) { return function (from, to, cb) {
            var start = Date.now()
            var backoff = 0;
            fs$rename(from, to, function CB (er) {
              if (er
                  && (er.code === "EACCES" || er.code === "EPERM")
                  /*&& Date.now() - start < 60000*/) {
                      console.log("Retrying rename file: " + from + " <> " + to)
                      fs$rename(from, to, CB);
                /*setTimeout(function() {
                  fs.stat(to, function (stater, st) {
                    if (stater && stater.code === "ENOENT")
                      fs$rename(from, to, CB);
                    else
                      cb(er)
                  })
                }, backoff)*/
                if (backoff < 100)
                  backoff += 10;
                return;
              }
              if (cb) cb(er)
            })
          }})(fs.rename)
          }
          

          其他:待补充