npm与UNMET PEER DEPENDENCY有关,与本地反应相关

时间:2015-12-04 00:07:35

标签: npm react-native

我认为我对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"
  }
}

2 个答案:

答案 0 :(得分:1)

我知道这是一个老问题,但对于将来看到此问题的其他人来说,回复仍然有用。

问题说明

在您的 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 次要 同一主要版本,对吗? (即,在 "^X.Y.Z" 范围内,所有 X.*.* 都应该有效,对吗?)。好吧,事实证明这不适用于 1.x 之前的范围。对于 0.x 范围,^ 插入符号仅涵盖范围内的 补丁 版本(来源: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 是主分支中当前的最新版本,将其作为问题提交给原始模块存储库是有意义的,和/或向他们提交 PR 提出更广泛的支持范围。例如:

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

范围 "< 1.0.0" 现在将允许 "^0.15.2" 版本范围。

如果您不想允许所有 0.x 版本怎么办?那么您可以使用更窄的范围,例如:"> 0.4.0 < 1.0.0"。查看 NPM semver 文档了解语法,还有更多可能性。

根本不要使用该模块/构建自己的模块

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

由于这个模块是公开的,你甚至可以 fork 项目并自己上传一个包含你想要的更改的新包版本(当然你必须使用不同的包名)。

答案 1 :(得分:-1)

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

npm install react-native@0.15.0 --save