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

Tob*_*obi 9 dependency-management dart flutter pubspec

我的 flutter 项目依赖于几个本地 flutter 和 dart 包来保持分离和干净。\n我的文件夹结构如下:

\n
main-flutter-project\n\xe2\x94\x82  lib\n|  test\n\xe2\x94\x82  pubspec.yaml\n\xe2\x94\x82\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 local-packages\n\xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 dart-package-1\n\xe2\x94\x82   \xe2\x94\x82     pubspec.yaml\n\xe2\x94\x82   \xe2\x94\x82\n\xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 flutter-package-1\n\xe2\x94\x82   \xe2\x94\x82     pubspec.yaml\n\xe2\x94\x82   \xe2\x94\x82\n\xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 flutter-package-2\n\xe2\x94\x82         pubspec.yaml\n...\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

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

\n

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

\n

我已经在 Maven 中看到了这一点,您可以在其中指定一个属性<junit.version>4.12</junit.version>并从其他地方访问它<version>${junit.version}</version>

\n

ook*_*.kb 22

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

AFAIK,没有内置或推荐的方法可以做到这一点,所以我们发明了一些技巧。

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

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

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

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

    export 'package:bar/bar.dart'
    
    Run Code Online (Sandbox Code Playgroud)

    这意味着foo您可以在包中编写import 'shared_dependencies/shared_dependencies.dart'并访问bar内容。

    优点:

    • 自动导入工作。

    对比:

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

    bar.dart:

    export 'package:bar/bar.dart'
    
    Run Code Online (Sandbox Code Playgroud)

    bloc.dart:

    export 'package:bloc_concurrency/bloc_concurrency.dart';
    export 'package:flutter_bloc/flutter_bloc.dart';
    
    Run Code Online (Sandbox Code Playgroud)

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

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

    bar:
    
    Run Code Online (Sandbox Code Playgroud)

    这基本上意味着您需要任何 bar包,但由于foo也依赖于shared_dependencies,因此将考虑其约束。如果您使用包中的某些可执行文件,则可能需要这样做,因为Dart SDKbar存在限制,不允许在传递依赖项中运行可执行文件。

在我们的项目中,我们最终使用了2最常用的包、3其他包以及4带有我们需要运行的可执行文件的包。