2

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

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文件必须保持更新的依赖关系。当我在说 5 个包中使用例如bloclibaraybloc: ^7.2.1时,我必须在pubspec发布新版本时分别更新每个文件中的版本。

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

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

4

1 回答 1

5

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

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'
    

    这意味着在您的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:
    

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

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

于 2022-01-20T20:56:30.233 回答