Flutter多仓库管理插件mono_repo的使用

发布于 1周前 作者 nodeper 来自 Flutter

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

1 回复

更多关于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流程。上述代码示例提供了一个基本的框架,你可以根据自己的需求进行扩展和定制。

回到顶部