【问题标题】:Share pubspec.yaml package dependency versions along multiple local flutter and dart packages与多个本地 Flutter 和 dart 包共享 pubspec.yaml 包依赖版本
【发布时间】:2021-10-21 13:39:41
【问题描述】:

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

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>

【问题讨论】:

    标签: flutter dart dependency-management pubspec


    【解决方案1】:

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

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

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

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

    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';
      

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

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

      bar:
      

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

    在我们的项目中,我们最终将2 用于最常用的包,3 用于其他包,4 用于需要运行可执行文件的包。

    【讨论】:

    • 非常感谢您的详细回答。这绝对有很大帮助!智能方法,通过共享依赖包提供。我会尽快奖励你的赏金
    • 3. 提出一个问题:只是在一个或多个导出语句上方添加评论,然后按评论名称将它们组合在一起?我理解正确吗?您说您可以通过导入 shared_dependencies/bloc.dart 来导入所有 bloc 依赖项,但在该示例中您不导出 bloc.dart。您只需将bloc.dart 作为评论放在与集团相关的出口上方。这似乎很奇怪,我觉得我没有正确理解3.
    • @tmaihoff 我的意思是它在不同的文件中,可能格式令人困惑。我已经更新了这一点,希望现在更清楚了。
    • 啊,我明白了,是的,这更有意义。现在知道了,谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-18
    • 1970-01-01
    • 1970-01-01
    • 2021-09-14
    • 2020-11-24
    • 2020-01-12
    • 2019-12-25
    相关资源
    最近更新 更多