Flutter多仓库管理插件mono_repo的使用
Flutter多仓库管理插件mono_repo的使用
mono_repo
是一个用于在单个代码库中管理多个Dart包的工具。它特别适用于Flutter和Dart项目,能够简化CI/CD配置、依赖管理和版本控制。
安装
首先,您需要全局激活 mono_repo
工具:
> dart pub global activate mono_repo
运行
您可以使用以下命令运行 mono_repo
:
> dart pub global run mono_repo
如果已将路径设置好,可以直接运行:
> mono_repo
这将打印帮助信息:
Manage multiple packages in one source repository.
Usage: mono_repo <command> [arguments]
Global options:
-h, --help Print this usage information.
--version Prints the version of mono_repo.
--[no-]recursive Whether to recursively walk sub-directories looking for packages.
(defaults to on)
--verbose Show full stack trace on error. (Useful for debugging.)
Available commands:
check Check the state of the repository.
dart Runs the `dart` command with the provided arguments across all packages.
generate Generates the CI configuration for child packages.
list List all packages configured for mono_repo.
presubmit Run the CI presubmits locally.
pub Runs the `pub` command with the provided arguments across all packages.
readme Generate a markdown table of all packages configured for mono_repo.
Run "mono_repo help <command>" for more information about a command.
配置
仓库级别配置
在您的仓库根目录创建一个 mono_repo.yaml
文件来控制仓库级别的配置。例如:
github:
# Specify the `on` key to configure triggering events.
# See https://docs.github.com/actions/reference/workflow-syntax-for-github-actions#on
cron: '0 0 * * 0' # “At 00:00 (UTC) on Sunday.”
env:
FOO: BAR
workflows:
lint:
name: Dart Lint CI
stages:
- analyze
on_completion:
- name: "Notify failure"
runs-on: ubuntu-latest
if: failure()
steps:
- run: >
curl -H "Content-Type: application/json" -X POST -d \
"{'text':'Build failed! ${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}/actions/runs/${GITHUB_RUN_ID}'}" \
"${CHAT_WEBHOOK_URL}"
env:
CHAT_WEBHOOK_URL: ${{ secrets.CHAT_WEBHOOK_URL }}
stages:
- name: cron
if: github.event_name == 'schedule'
self_validate: analyze
merge_stages:
- analyze
coverage_service:
- coveralls
- codecov
添加包配置
每个要包含的包目录必须包含一个 mono_pkg.yaml
文件(以及正常的 pubspec.yaml
文件)。例如:
sdk:
- dev
- pubspec
stages:
- analyze:
- analyze
- format
- unit_test:
- test
- cron:
- test:
os:
- linux
- windows
生成 .github/dependabot.yml
通过在 mono_repo.yaml
中添加以下内容,mono_repo
将生成一个 .github/dependabot.yml
文件:
github:
dependabot: {}
进一步配置可以合并到映射中,并与包的更新合并。例如:
github:
dependabot:
updates:
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "monthly"
示例Demo
假设我们有一个简单的Flutter项目结构如下:
my_flutter_repo/
├── package_a/
│ ├── pubspec.yaml
│ └── mono_pkg.yaml
├── package_b/
│ ├── pubspec.yaml
│ └── mono_pkg.yaml
└── mono_repo.yaml
mono_repo.yaml
内容示例:
github:
cron: '0 0 * * 0'
workflows:
lint:
name: Dart Lint CI
stages:
- analyze
self_validate: analyze
merge_stages:
- analyze
coverage_service:
- coveralls
- codecov
package_a/mono_pkg.yaml
内容示例:
sdk:
- dev
stages:
- analyze:
- analyze
- format
- unit_test:
- test
package_b/mono_pkg.yaml
内容示例:
sdk:
- dev
stages:
- analyze:
- analyze
- format
- unit_test:
- test
运行以下命令生成CI配置文件:
> mono_repo generate
更多关于Flutter多仓库管理插件mono_repo的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter多仓库管理插件mono_repo的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
在Flutter项目中,使用mono_repo
插件进行多仓库管理可以极大地简化对多个相关包的同步开发和维护。mono_repo
通常用于包含多个Flutter或Dart包的单一代码库中。以下是如何设置和使用mono_repo
的一些代码示例和步骤。
1. 设置mono_repo
首先,你需要确保你的项目结构符合mono_repo
的要求。一个典型的mono_repo
项目结构可能如下:
my_mono_repo/
├── packages/
│ ├── package_a/
│ │ ├── lib/
│ │ ├── pubspec.yaml
│ ├── package_b/
│ ├── lib/
│ ├── pubspec.yaml
├── .dartignore
├── tool/
│ ├── bin/
│ │ └── repo.dart
├── pubspec.yaml
2. 创建repo.dart
脚本
在tool/bin/
目录下创建一个名为repo.dart
的Dart脚本,用于管理你的仓库。这个脚本通常会包含一些常用的命令,比如获取依赖、运行测试等。以下是一个简单的示例:
import 'dart:io';
void main(List<String> arguments) async {
// 解析命令行参数
final List<String> args = List.from(arguments);
if (args.isEmpty) {
print('Usage: dart tool/bin/repo.dart <command> [arguments]');
print('Available commands: get, test');
exit(1);
}
final String command = args.first;
final List<String> commandArgs = args.skip(1).toList();
switch (command) {
case 'get':
await _getDependencies(commandArgs);
break;
case 'test':
await _runTests(commandArgs);
break;
default:
print('Unknown command: $command');
exit(1);
}
}
Future<void> _getDependencies(List<String> args) async {
final Directory packagesDir = Directory('packages');
if (!await packagesDir.exists()) {
print('No packages directory found.');
exit(1);
}
final List<Directory> packageDirs = packagesDir.listSync(recursive: false, followLinks: false)
.whereType<Directory>()
.where((dir) => dir.basename.startsWith('package_'))
.toList();
for (final Directory packageDir in packageDirs) {
final ProcessResult result = await Process.run('flutter', ['pub', 'get'], workingDirectory: packageDir.path);
print(result.stdout);
if (result.exitCode != 0) {
print('Error getting dependencies for ${packageDir.path}');
exit(1);
}
}
}
Future<void> _runTests(List<String> args) async {
// 类似地,遍历每个包并运行测试
// ...
}
3. 使用repo.dart
脚本
现在你可以使用repo.dart
脚本来管理你的依赖和测试。例如,获取所有包的依赖:
dart tool/bin/repo.dart get
或者运行所有包的测试:
dart tool/bin/repo.dart test
4. 配置CI/CD
在你的CI/CD配置文件中(如.github/workflows/ci.yml
),你可以使用类似的命令来自动化你的构建和测试流程。例如:
name: CI
on: [push, pull_request]
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Set up Dart
uses: dart-lang/setup-dart@v1
- name: Get dependencies
run: dart tool/bin/repo.dart get
- name: Run tests
run: dart tool/bin/repo.dart test
这个配置会在每次代码推送或拉取请求时自动运行你的repo.dart
脚本来获取依赖并运行测试。
总结
通过mono_repo
结构和一个自定义的repo.dart
脚本,你可以有效地管理多个相关的Flutter/Dart包。这种方法提高了开发效率,确保了包之间的一致性,并简化了CI/CD流程。上述代码示例提供了一个基本的框架,你可以根据自己的需求进行扩展和定制。