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