【问题标题】:npm issues with UNMET PEER DEPENDENCY, related to react-nativenpm 与 UNMET PEER DEPENDENCY 相关的问题,与 react-native 相关
【发布时间】:2016-03-08 19:33:35
【问题描述】:

我想我对 npm 如何管理依赖关系感到困惑。我看到了:

npm list react-native
project@0.0.1 /Users/me/workspace/project
└── UNMET PEER DEPENDENCY react-native@0.15.0

npm ERR! peer dep missing: react-native@^0.13.2, required by react-native-dialogs@0.0.5
npm ERR! code 1

所以我尝试...但我得到了:

   npm install react-native@0.15.0

    ....

    project@0.0.1 /Users/me/workspace/project
└─┬ UNMET PEER DEPENDENCY react-native@0.15.0
  └── react-tools@0.14.0-beta1  (git+https://github.com/facebook/react.git#b4e74e38e43ac53af8acd62c78c9213be0194245)

npm WARN EPEERINVALID react-native-dialogs@0.0.5 requires a peer of react-native@^0.13.2 but none was installed.
npm ERR! code 1

我的 package.json:

{
  "name": "project",
  "version": "0.0.1",
  "private": true,
  "scripts": {
    "start": "react-native start"
  },
  "dependencies": {
    "apsl-react-native-button": "^2.1.0",
    "base-64": "^0.1.0",
    "es6-react-mixins": "^0.2.1",
    "fifo": "^2.3.0",
    "money-math": "^2.2.0",
    "react-native": "^0.15.0",
    "react-native-dropdown-android": "0.0.4",
    "react-native-lightbox": "^0.5.0",
    "react-native-mail": "^0.2.4",
    "react-native-router-flux": "^0.3.4",
    "react-native-simpledialog-android": "^1.0.2",
    "react-native-swiper": "^1.3.0",
    "superagent": "^1.4.0",
    "tcomb-form-native": "^0.3.0",
    "utf8": "^2.1.1",
    "react-native-facebook-login": "^1.0.0"
  }
}

【问题讨论】:

  • 我知道有点晚但对我有用,也许尝试删除 node_modules 并再次运行?

标签: npm react-native


【解决方案1】:

尝试“npm install”命令的“--save”参数,例如:

npm install react-native@0.15.0 --save

【讨论】:

    【解决方案2】:

    我知道这是一个老问题,但对于其他人在未来看到这个问题时,回复仍然有用。

    问题说明

    在您的 package.json 中,您正在安装依赖项 react-native-dialogs@0.0.5,它与 peerDependency 模块一样期待:react-native@^0.13.2。由于该项目是公开的,因此可以在他们的package.json 文件中进行验证:

      "peerDependencies": {
        "react-native": "^0.13.2"
      }
    

    该语句的第一部分是模块名称,第二部分是支持的版本范围

    这意味着根模块应该在这样的版本范围内提供这样的依赖,以便安装成功而没有错误。在这种情况下,它声明了react-native 依赖关系,并且在^0.13.2 版本范围内。

    现在,在您的 package.json 中,您列出了依赖项:

        "react-native": "^0.15.0",
    

    那么为什么它不起作用?版本范围中的^(插入符号)应该包括同一主要版本中的所有patch minor 版本,对吧? (即在"^X.Y.Z" 范围内,所有X.*.* 都应该工作,对吧?)。好吧,事实证明这对于 1.x 之前的范围是不正确的。对于 0.x 范围,^ 插入符号仅涵盖范围内的 patch 版本(来源:NPM docs)。

    因此,根据这条规则,"^0.15.0" 不在"^0.13.2" 的范围内,所以这就是您收到UNMET PEER DEPENDENCY 错误的原因。

    可能的解决方案

    这里有几个选项。

    提供预期的对等依赖

    最直接的方法是在预期版本范围内的版本中提供预期的对等依赖项。

    因此您可以使用相同的版本范围,在本例中为:"^0.13.2"。或者也指定一个确切的版本,例如:"0.13.2"

    提示:您可以使用此实用程序https://semver.npmjs.com/,检查与给定包的请求范围匹配的所有版本。

    对于这种情况,唯一存在且与范围匹配的版本是"0.13.2",但可能还有更多(即"0.13.3",如果它存在的话也可以。但是“0.14. 0" 或 "0.12.0" 不起作用,如上所述)

    更新你的模块依赖

    在许多情况下,原始模块会升级,更改可能包括支持不同或更广泛的 peerDependencies 包/版本。

    截至今天,我可以在package.json on the project master branch 中看到,当前模块版本是 1.1.1,并且 peerDependencies 已删除,因此升级您的 "react-native-dialogs" 依赖版本 ^0.0.5 -> ^1.1.1 会为这个场景做这项工作

    但是,如果这没有发生,或者您不想升级到最新版本怎么办?让我们探索更多选项。

    更改你想要依赖的模块本身

    如果您使用的模块提供作为 peerDependency 的依赖项版本与您的要求冲突,将此依赖项升级到删除此约束的较新版本对您不起作用。

    "^0.13.2" 的允许范围可能非常有限,即。它不支持0.14.0 及更高版本。这背后的原因可能是基于兼容性问题,或者可能只是缺乏允许/支持更多版本的意识。可能碰巧存在其他可以正常工作的版本,但最初的开发者没有采取额外的步骤来包含它们。

    因此,您只想按原样继续使用该模块,但允许使用更新的react-native 版本。

    想象一下原始场景,0.0.5 是 master 分支中的当前最新版本,将其作为问题提交给原始模块 repo 和/或向他们提交提出更广泛支持范围的 PR 可能是有意义的。例如:

      "peerDependencies": {
        "react-native": "< 1.0.0"
      }
    

    "&lt; 1.0.0" 范围现在允许"^0.15.2" 版本范围。

    如果您不想允许所有 0.x 版本怎么办?然后您可以使用更窄的范围,例如:"&gt; 0.4.0 &lt; 1.0.0"。看看NPM semver docs 的语法,还有更多的可能性。

    根本不要使用那个模块/构建你自己的

    可能会发生原始模块被废弃、存在错误或无法满足您的所有要求的情况。在这种情况下,您可以在社区中寻找一些可用的替代方案,甚至自己构建一个。

    由于此模块是公开的,您甚至可以分叉该项目并自己上传一个新的包版本,其中包含您想要的更改(当然,您必须使用不同的包名称)。

    【讨论】:

      猜你喜欢
      • 2017-04-22
      • 2017-08-14
      • 2016-09-18
      • 1970-01-01
      • 2016-06-14
      • 2018-06-13
      • 2017-01-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多