冲突解决
假设你想在应用中使用 some_package
和 other_package
,并且它们依赖于不同版本的 url_launcher
。于是我们便有了潜在的冲突。避免这种情况的最好方法是 package 的作者在指定依赖项时使用 版本范围 而非特定版本。
dependencies: url_launcher: ^5.4.0 # Good, any version >= 5.4.0 but < 6.0.0 image_picker: '5.4.3' # Not so good, only version 5.4.3 works.
如果 some_package
声明了以上依赖,并且 another_package
声明了一个兼容的 url_launcher
依赖项,如 '5.4.6'
或 ^5.5.0
, pub 能够自动解决冲突问题。 Gradle modules 和 CocoaPods 也是用类似的方式解决平台依赖的。
即使 some_package
和 another_package
声明了不兼容的 url_launcher
版本,它们实际上仍可能以兼容的方式使用 url_launcher
。在这种情况下,可在 pubspec.yaml
文件中添加一个依赖覆盖声明来强制使用特定版本,从而处理冲突。
为了强制使用版本为 5.4.0
的 url_launcher
,你可以对应用的 pubspec.yaml
文件做如下更改:
dependencies: some_package: another_package:dependency_overrides: url_launcher: '5.4.0'
如果依赖冲突项不是 package 自身,而是如 guava
这样特定于 Android 的库,那么依赖的覆盖声明必须添加到 Gradle 的构建逻辑中。
为了强制使用版本为 28.0
的 guava
,你可以对 android/build.gradle
文件做如下更改:
configurations.all { resolutionStrategy { force 'com.google.guava:guava:28.0-android' }}
CocoaPods 目前尚不提供依赖项覆盖功能。