Dart 包:依赖冲突

nig*_*ong 8 dart dart-pub flutter

在 Dart/Flutter 项目中,我有

dependencies:
  graphql: '^2.1.1-beta.5'
  flutter_bloc: ^3.0.0
Run Code Online (Sandbox Code Playgroud)

作为依赖。但是,graphql取决于rxdart: ^0.22.0flutter_bloc取决于rxdart: ^0.23.0,这给了我错误:

Because flutter_bloc >=3.0.0 depends on bloc ^3.0.0 which depends on rxdart ^0.23.0, flutter_bloc >=3.0.0 requires rxdart ^0.23.0.
And because graphql 2.1.1-beta.5 depends on rxdart ^0.22.0 and no versions of graphql match >2.1.1-beta.5 <3.0.0, flutter_bloc >=3.0.0 is incompatible with graphql ^2.1.1-beta.5.
So, because com.myapp depends on both graphql ^2.1.1-beta.5 and flutter_bloc ^3.0.0, version solving failed.
Run Code Online (Sandbox Code Playgroud)

我的临时解决方法是降级flutter_bloc^2.1.1,它使用rxdart ^0.23.0. 但是如果我想使用最新最好的版本flutter_bloc,最好的解决方案是什么?

谢谢!

cre*_*not 9

您可以在以下位置使用依赖项覆盖pubspec.yaml

dependency_overrides:
  rx_dart: ^0.23.0
Run Code Online (Sandbox Code Playgroud)

请注意,如果您这样做,依赖于您覆盖的依赖项的另一个版本的插件可能会中断。

  • 有没有办法针对不同的依赖项使用不同版本的公共包? (2认同)

Aks*_*aru 8

免责声明:我不是答案的所有者。我只是发布参考答案:https : //iiro.dev/resolving-dart-package-version-conflicts/

这对我有帮助。

假设你有这样的问题:

Because intl_translation 0.17.0 depends on petitparser ^1.1.3 and xml >=3.2.0 
depends on petitparser ^2.0.0, intl_translation 0.17.0 is incompatible with xml >=3.2.0.

So, because my_project depends on both xml ^3.2.0 and intl_translation 0.17.0, 
version solving failed.
Run Code Online (Sandbox Code Playgroud)

pubspec 文件可能看起来像这样:

pubspec.yaml
dependencies:
  # ...
  xml: ^3.2.0
  intl_translation: ^0.17.0
Run Code Online (Sandbox Code Playgroud)

解决方案:解决此问题的最快方法是将两个冲突的依赖项的版本都设置为any.

pubspec.yaml
dependencies:
  # ...
 xml: any # <- don't leave me like this - read further!

 intl_translation: any # <- don't leave me like this either!
Run Code Online (Sandbox Code Playgroud)

^^这不是解决方案,还有一步!

输出可能如下所示:

Resolving dependencies... 
Got dependencies!
Run Code Online (Sandbox Code Playgroud)

在构建项目后,您应该收紧依赖版本以像以前一样使用语义版本控制。打开生成的 pubspec.lock 文件找到之前冲突的依赖项

pubspec.lock
# Generated by pub
# See https://www.dartlang.org/tools/pub/glossary#lockfile
packages:
  xml:
    # ...
    version: "3.0.1" # the version of "xml" package that worked fine
                     # with "intl_translation".
  intl_translation:
    # ...
    version: "0.17.0" # the version of "intl_translation" package
                      # that worked fine with "xml".
Run Code Online (Sandbox Code Playgroud)

从那个锁文件中,我们可以看到 xml 包版本3.0.1和 intl_translation 包版本0.17.0配合得很好。作为最后一步,将 any 替换为 pubspec 文件中的正确版本:

pubspec.yaml
dependencies:
  # ...
  xml: ^3.0.1
  intl_translation: ^0.17.0
Run Code Online (Sandbox Code Playgroud)

最后一次通过运行flutter packages get来重新获取您的依赖项以验证这确实有效,然后您就可以开始了

回答学分:Iiro Krankka