npm:何时使用 `--force` 和 `--legacy-peer-deps`

如何解决npm:何时使用 `--force` 和 `--legacy-peer-deps`

我是 npm 的新手,正在尝试了解重新创建 node_modules 目录以进行部署的工作原理。

我们使用 npm ci 而不是 npm install 以确保在部署期间干净利落。但是,当我们在没有任何标志的情况下运行它时,会出现以下错误

修复上游依赖项冲突,或使用 --force 或 --legacy-peer-deps 重试此命令以接受不正确(并且可能已损坏)的依赖项解析。

npm install--forcedocumentation 如下(npm ci 上没有标记) s page):

-f 或 --force 参数将强制 npm 获取远程资源,即使磁盘上存在本地副本。

与此同时,--legacy-peer-deps 的文档说:

--legacy-peer-deps:安装时忽略所有peerDependencies,采用npm 4到6版本的风格。

似乎这两个标志都会让 npm ci 生成 node_modules 目录而没有任何问题,但我仍然不清楚两者之间的区别。

据我所知,--force 听起来像是最后一次下载的依赖项,并且会覆盖之前下载的所有依赖项。同时,--legacy-peer-deps 听起来好像在安装过程中总是会跳过对等依赖项(无论是什么),即使没有问题。

这两个标志有什么区别,我们应该在什么时候使用它们?

解决方法

在新版 npm (v7) 中,默认情况下,npm install 在遇到 peerDependencies 冲突时会失败。以前不是这样的。

查看 here 以了解有关 npm v7 中对等依赖项的更多信息。

两者的区别如下-

  • --legacy-peer-deps:在安装时忽略所有 peerDependencies,以 npm 版本 4 到版本 6 的样式。

  • --strict-peer-deps:在遇到任何冲突的 peerDependencies 时失败并中止安装过程。默认情况下,npm 只会在 peerDependencies 由根项目的直接依赖引起的冲突时崩溃。

,

https://github.blog/2021-02-02-npm-7-is-now-generally-available/的文章

您可以选择使用 --force 重试以绕过冲突或 --legacy-peer-deps 命令完全忽略对等依赖 (此行为类似于版本 4-6)。

我同意这句话不是很清楚,但“完全忽略对等依赖”听起来不太好。让我们用一个真实的例子:

这是我在 npm install 时遇到的对等依赖错误:

npm ERR! code ERESOLVE
npm ERR! ERESOLVE unable to resolve dependency tree
npm ERR!
npm ERR! While resolving: mobile@undefined
npm ERR! Found: react@17.0.1
npm ERR! node_modules/react
npm ERR!   react@"17.0.1" from the root project
npm ERR!   peer react@">=16.0.0" from @testing-library/react-native@7.2.0
npm ERR!   node_modules/@testing-library/react-native
npm ERR!     dev @testing-library/react-native@"7.2.0" from the root project
npm ERR!
npm ERR! Could not resolve dependency:
npm ERR! peer react@"16.13.1" from react-native@0.63.2
npm ERR! node_modules/react-native
npm ERR!   react-native@"https://github.com/expo/react-native/archive/sdk-39.0.4.tar.gz" from the root project
npm ERR!   peer react-native@">=0.59" from @testing-library/react-native@7.2.0
npm ERR!   node_modules/@testing-library/react-native
npm ERR!     dev @testing-library/react-native@"7.2.0" from the root project
npm ERR!
npm ERR! Fix the upstream dependency conflict,or retry
npm ERR! this command with --force,or --legacy-peer-deps
npm ERR! to accept an incorrect (and potentially broken) dependency resolution.
npm ERR!
npm ERR! See /Users/me/.npm/eresolve-report.txt for a full report.

npm ERR! A complete log of this run can be found in:
npm ERR!     /Users/me/.npm/_logs/2021-03-13T00_10_33_813Z-debug.log
npm ERR! code 1
npm ERR! path /Users/me/my-app
npm ERR! command failed
npm ERR! command sh -c sh ./bin/setup.sh

npm ERR! A complete log of this run can be found in:
npm ERR!     /Users/me/.npm/_logs/2021-03-13T00_10_33_860Z-debug.log

以下是 --legacy-peer-deps--force 之间的 package-lock.json 区别。

  1. 如果我运行 npm install --legacy-peer-deps,它会在我的 package-lock.json 中添加:
"node_modules/@unimodules/react-native-adapter": {
  "version": "5.7.0","resolved": "https://registry.npmjs.org/@unimodules/react-native-adapter/-/react-native-adapter-5.7.0.tgz","integrity": "sha512-L557/+sc8ZKJVgo1734HF1QNCxrt/fpqdmdNgySJT+kErux/AJNfPq3flsK0fyJduVmniTutYIMyW48cFoPKDA==","dependencies": {
    "invariant": "^2.2.4","lodash": "^4.5.0"
  },"peerDependencies": {
    "react-native": "*","react-native-web": "~0.13.7"
  }
},...

"@unimodules/react-native-adapter": {
  "version": "5.7.0","requires": {
    "invariant": "^2.2.4","lodash": "^4.5.0"
  }
},
  1. 如果我使用 npm install --force,它会添加
"node_modules/expo/node_modules/@unimodules/react-native-adapter": {
  "version": "5.7.0","node_modules/expo/node_modules/inline-style-prefixer": {
  "version": "5.1.2","resolved": "https://registry.npmjs.org/inline-style-prefixer/-/inline-style-prefixer-5.1.2.tgz","integrity": "sha512-PYUF+94gDfhy+LsQxM0g3d6Hge4l1pAqOSOiZuHWzMvQEGsbRQ/ck2WioLqrY2ZkHyPgVUXxn+hrkF7D6QUGbA==","peer": true,"dependencies": {
    "css-in-js-utils": "^2.0.0"
  }
},"node_modules/expo/node_modules/react-native-web": {
  "version": "0.13.18","resolved": "https://registry.npmjs.org/react-native-web/-/react-native-web-0.13.18.tgz","integrity": "sha512-WR/0ECAmwLQ2+2cL2Ur+0/swXFAtcSM0URoADJmG6D4MnY+wGc91JO8LoOTlgY0USBOY+qG/beRrjFa+RAuOiA==","dependencies": {
    "array-find-index": "^1.0.2","create-react-class": "^15.6.2","deep-assign": "^3.0.0","fbjs": "^1.0.0","hyphenate-style-name": "^1.0.3","inline-style-prefixer": "^5.1.0","normalize-css-color": "^1.0.2","prop-types": "^15.6.0","react-timer-mixin": "^0.13.4"
  },"peerDependencies": {
    "react": ">=16.5.1","react-dom": ">=16.5.1"
  }
},...

  "dependencies": {
    "@unimodules/react-native-adapter": {
      "version": "5.7.0","requires": {
        "invariant": "^2.2.4","lodash": "^4.5.0"
      }
    },"inline-style-prefixer": {
      "version": "5.1.2","requires": {
        "css-in-js-utils": "^2.0.0"
      }
    },"react-native-web": {
      "version": "0.13.18","requires": {
        "array-find-index": "^1.0.2","react-timer-mixin": "^0.13.4"
      }
    }
  }
},

如您所见,npm install --force 仍然固定了许多更严格的依赖版本。

因此,对于 npm 7,如果 npm install 由于对等依赖问题而失败,则您可以尝试的第一件事是 npm install --force

,

当项目有版本的 NPM 冲突并且错误增加时。

错误

An unhandled exception occurred: The 'buildOptimizer' option cannot be used without 'aot'.

.npmrc 文件中

legacy-peer-deps true

命令提示符

npm install 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?