与多个本地 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
.有一些方法可以做到这一点:
直接导入依赖。由于 foo
可传递地依赖于 bar
,您只需编写 import package:bar/bar.dart
即可。不过这不是最好的方法:
- 导入传递依赖是不好的做法(甚至有 linter rule);
- 自动导入将不起作用;
导出 shared_dependencies
包中的包。 IE。 shared_dependencies.dart
可以包含以下行:
export 'package:bar/bar.dart'
这意味着在您的 foo
包中,您只需编写 import 'shared_dependencies/shared_dependencies.dart'
即可访问 bar
内容。
优点:
- 自动导入工作。
对比:
- 如果您导出多个包,可能会出现名称冲突(您必须在导出时隐藏一些名称);
- 如果
foo
包仅依赖于一个 bar
包,导入所有 shared_dependencies. 可能会很奇怪
在 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'
。自动导入也可以。
添加对foo
包的直接依赖,但不指定版本限制:
bar:
这基本上意味着你需要 any bar
包,但是由于 foo
也依赖于 shared_dependencies
,它的约束将被采用考虑到。如果您使用 bar
包中的某些可执行文件,可能需要这样做,因为有一个 limitation in Dart SDK 不允许 运行 可执行文件在传递依赖项中。
在我们的项目中,我们最终对最常用的包使用 2
,对其他包使用 3
,对包含我们需要的可执行文件的包使用 4
运行.
我的 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
.有一些方法可以做到这一点:
直接导入依赖。由于
foo
可传递地依赖于bar
,您只需编写import package:bar/bar.dart
即可。不过这不是最好的方法:- 导入传递依赖是不好的做法(甚至有 linter rule);
- 自动导入将不起作用;
导出
shared_dependencies
包中的包。 IE。shared_dependencies.dart
可以包含以下行:export 'package:bar/bar.dart'
这意味着在您的
foo
包中,您只需编写import 'shared_dependencies/shared_dependencies.dart'
即可访问bar
内容。优点:
- 自动导入工作。
对比:
- 如果您导出多个包,可能会出现名称冲突(您必须在导出时隐藏一些名称);
- 如果
foo
包仅依赖于一个bar
包,导入所有 shared_dependencies. 可能会很奇怪
在
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'
。自动导入也可以。添加对
foo
包的直接依赖,但不指定版本限制:bar:
这基本上意味着你需要 any
bar
包,但是由于foo
也依赖于shared_dependencies
,它的约束将被采用考虑到。如果您使用bar
包中的某些可执行文件,可能需要这样做,因为有一个 limitation in Dart SDK 不允许 运行 可执行文件在传递依赖项中。
在我们的项目中,我们最终对最常用的包使用 2
,对其他包使用 3
,对包含我们需要的可执行文件的包使用 4
运行.