与多个本地 flutter 和 dart 包共享 pubspec.yaml 包依赖版本

Share pubspec.yaml package dependency versions along multiple local flutter and dart packages

我的 flutter 项目依赖于几个本地的 flutter 和 dart 包来保持分离和清洁。 我的文件夹结构是这样的:

main-flutter-project
│  lib
|  test
│  pubspec.yaml
│
└── local-packages
│   └── dart-package-1
│   │     pubspec.yaml
│   │
│   └── flutter-package-1
│   │     pubspec.yaml
│   │
│   └── flutter-package-2
│         pubspec.yaml
...

每个本地包都是自包含的,可以在不接触主项目的情况下进行维护。

这个结构意味着我有许多 pubspec.yaml 文件,我必须在其中更新依赖项。 当我使用例如bloc libaray bloc: ^7.2.1 在说 5 个包中,我必须在发布新版本时分别更新每个 pubspec 文件中的版本。

是否可以仅在其他 pubspec.yaml 文件引用的一个地方指定那些共享包依赖版本?

我见过这个,例如使用 Maven,您可以在其中指定 属性 <junit.version>4.12</junit.version> 并从其他地方访问它 <version>${junit.version}</version>.

我们正在解决类似的问题。

据我所知,没有内置或推荐的方法来执行此操作,因此我们发明了一些技巧。

在我们的例子中,我们有 core 具有一些共享功能和共同依赖项的包,如果您没有,您仍然可以创建一个人工包,比方说,shared_dependencies包,并在那里指定所有共享依赖项。

现在,假设包 foo 依赖于 shared_dependencies 包,并且 foo 需要使用 shared_dependecies 包中定义的依赖项 bar .有一些方法可以做到这一点:

  1. 直接导入依赖。由于 foo 可传递地依赖于 bar,您只需编写 import package:bar/bar.dart 即可。不过这不是最好的方法:

    • 导入传递依赖是不好的做法(甚至有 linter rule);
    • 自动导入将不起作用;
  2. 导出 shared_dependencies 包中的包。 IE。 shared_dependencies.dart 可以包含以下行:

    export 'package:bar/bar.dart'
    

    这意味着在您的 foo 包中,您只需编写 import 'shared_dependencies/shared_dependencies.dart' 即可访问 bar 内容。

    优点:

    • 自动导入工作。

    对比:

    • 如果您导出多个包,可能会出现名称冲突(您必须在导出时隐藏一些名称);
    • 如果 foo 包仅依赖于一个 bar 包,导入所有 shared_dependencies.
    • 可能会很奇怪
  3. shared_dependencies 包的单独库中导出。您可以将一些相关的包放在不同的文件中,例如:

    bar.dart:

    export 'package:bar/bar.dart'
    

    bloc.dart:

    export 'package:bloc_concurrency/bloc_concurrency.dart';
    export 'package:flutter_bloc/flutter_bloc.dart';
    

    在那种情况下,如果你需要bar包在foo,你写import 'package:shared_dependencies/bar.dart';如果你需要bloc,你写import 'package:shared_dependencies/bloc.dart'。自动导入也可以。

  4. 添加对foo包的直接依赖,但不指定版本限制:

    bar:
    

    这基本上意味着你需要 any bar 包,但是由于 foo 也依赖于 shared_dependencies,它的约束将被采用考虑到。如果您使用 bar 包中的某些可执行文件,可能需要这样做,因为有一个 limitation in Dart SDK 不允许 运行 可执行文件在传递依赖项中。

在我们的项目中,我们最终对最常用的包使用 2,对其他包使用 3,对包含我们需要的可执行文件的包使用 4 运行.