乐趣区

关于flutter:用-Melos-管理多包-Flutter-项目

猫哥说

我正在的写的新闻客户端代码模板,只是适宜最多 100 pages 的轻巧型单包我的项目。

然而页面再多的话,阐明你的我的项目业务、性能、组件足够简单,我的项目也宏大,参加的人也多,这样的话我的项目就须要多包架构了,做过 android 的敌人最能领会了。

这篇文章就是介绍如何用 melos 来治理多包我的项目,看看对你是否有帮忙吧。

老铁记得 转发,猫哥会出现更多 Flutter 好文~~~~

微信 flutter 研修群 ducafecat

原文

代码

https://github.com/SAGARSURI/…

integrate_melos 分支是实现的代码

参考

  • https://docs.page/invertase/m…
  • https://invertase.io/

注释

大多数状况下,当你创立一个 flutter 我的项目。你应用一个包。这个我的项目由一个 pubspec.yaml,lib 文件夹组成。您将所有的个性和实用程序放在同一个包中。但也有一些我的项目将它们的个性和实用程序分解成多个包。这有助于进步关注点拆散,并容许团队开源他们的一些软件包。上面是一个多包我的项目的示意图:

在这里,咱们将我的项目分为三个档次。第一层是根我的项目,它蕴含实用于我的项目中所有不同包的通用配置。第二层领有独立的性能包,它们不相互依赖。第三层由多个性能包中应用的实用工具包组成。我不会深入探讨如何创立或构造一个多包 flutter 我的项目。本文将着重于解决一个典型的多包 flutter 我的项目所面临的非凡挑战。

挑战

在一个简略的程序包中,运行上面的工作是非常简单的:

  • flutter pub get
  • flutter test
  • flutter analyze
  • Generating code coverage i.e flutter test –coverage

然而在一个多包的 flutter 我的项目中运行雷同的工作是具备挑战性的,因为你须要在我的项目中的每个包中运行这些工作,并在工作实现后给出总结后果。当初咱们晓得挑战是什么了。让咱们来讨论一下解决这个问题的可能办法。

解决方案

有两种可能的解决方案来解决这个问题。让咱们看看第一个:

  1. 为各种工作编写 bash 脚本

这相对是一个解决方案,但不是一个理智的解决方案。您须要首先编写一个脚本,找出我的项目中的所有包,并在其中运行上述工作之一。您还须要确保以丑陋的格局显示输入,以使内容具备可读性。如果您更喜爱 GUI,那么您须要在 IDE 中创立某种配置,以便通过 GUI 运行脚本

  1. 将 Melos 整合到你的我的项目中

这是一个比我强烈推荐的第一个计划更聪慧的解决方案。因而,让咱们具体探讨什么是 Melos,以及如何将其集成到您的多包我的项目中

介绍 Melos

Melos 是一个 CLI 工具,用于治理多个包的 flutter/ 飞镖我的项目。

Melos 是由一个驰名的小组在 flutter 社区即 invertase。你能够在他们的网站上浏览对于 Melos 的详细信息,然而这里有一个 Melos 提供的个性的疾速列表:

  • Automatic versioning & changelog generation. 主动版本控制和更新日志生成
  • Automated publishing of packages to 将包主动公布到 pub.dev.
  • Local package linking and installation. 本地包的链接和装置
  • Executing simultaneous commands across packages. 跨包执行同步命令
  • Listing of local packages & their dependencies. 本地包及其依赖项的列表

当初让咱们看看如何应用 Melos 执行上述所有工作。

  • 留神: 如果你想在实践中学习,请下载入门课程。还有另一个分支,您能够在其中找到我的项目的最终版本。

https://github.com/SAGARSURI/…

装置 Melos

让咱们先装置 Melos。我假如您曾经装置了 Flutter SDK,并将 Flutter 和 Dart 门路设置为 bash_profile。在终端中运行以下命令:

dart pub global activate melos

下一步是在 IDE 中关上初学者我的项目。我更喜爱应用 Intellij,并且会向你展现一些由 Melos 提供的十分棒的 GUI 个性。我的项目构造应如下:

当初创立一个名为 melos.yaml 的文件,并将以下内容复制到其中:

name: melos_demo

packages:
  - utility/**
  - features/**
  - "*"

让咱们了解一下下面的脚本:
a) name : 你必须给出我的项目的名称。您能够在 root 我的项目的 pubspec.yaml 中找到它.
b) packages : 这个列表应该蕴含到我的项目中单个软件包的门路. 能够应用 glob 模式开展格局定义每个门路.

Melos Bootstrap

当初,从根我的项目中在终端中运行以下命令,将所有本地包链接在一起,并更新依赖关系,即 flutter pub get。

melos bootstrap

在运行下面的命令之后,你应该会看到如下的输入:

你能够在这里浏览为什么你须要疏导 Melos。精确地说,这是在我的项目中设置 Melos 或执行我的项目清理时应该执行的重要命令之一。

https://docs.page/invertase/m…

Melos Clean

当您心愿从我的项目中删除临时文件 (构建工件、pub 文件等) 时,能够执行此命令。上面是这个命令的样子:

melos clean

Commands

当初,您将着手创立不同的命令,以实现咱们在本文结尾提到的工作。

在特定的包中运行测试用例在你的 melos.yaml 文件中写入以下命令:

name: melos_demo

packages:
  - utility/**
  - features/**
  - "*"

scripts:
  test:selective_unit_test:
    run: melos exec --dir-exists="test" --fail-fast -- flutter test --no-pub --coverage
    description: Run Flutter tests for a specific package in this project.
    select-package:
      flutter: true
      dir-exists: test

让咱们了解一下下面的脚本中产生了什么:

1)你曾经创立了一个自定义脚本,即 test: selective_unit_test,一旦执行,它会显示一个选项来抉择一个你想要运行的单元测试包。

  1. Melos 提供了弱小的过滤选项来抉择合乎过滤条件的包。在下面的脚本中,您应用 — dir-exists =“test”作为筛选选项。这将过滤由 testfolder 组成的所有包。你能够在他们的网站上找到更多的过滤选项。

3)——如果遇到失败的测试用例,fail-fast 将立刻终止脚本执行。

4)您能够应用形容局部为每个脚本提供一个可读的形容。

5)你肯定想晓得为什么你把这个命令命名为 test: selective_unit_test。下一个命令将答复您的问题。

6)你能够具体浏览 melos exec 做了什么。基本上,它将在我的项目中的每个包中执行命令或脚本。

https://docs.page/invertase/m…

当初运行以下命令:

melos run test:selective_unit_test

您将看到以下输入:

下面的命令可能找出蕴含文件夹测试的这些包。输出 2 作为选项,你会看到如下输入:

在所有包中运行测试用例当初编写以下命令,它将运行我的项目中的所有单元测试用例。这不会提醒任何选项的抉择:

scripts:
  test:
    run: melos run test:selective_unit_test --no-select
    description: Run all Flutter tests in this project.

让咱们讨论一下下面的命令是做什么的:

  1. 这个命令将基本上运行上一个命令 –no-select as an argument. 这意味着运行所有的单元测试
  2. 你能够应用 melos 来运行这个命令 因为可能有多个变种的测试命令,就像您在前一步骤 i.e 中创立的那样 test:selective_unit_test . 您还能够创立更多的变种,例如 test:e2e_test , test:bdd_test etc. 你能够将所有的变量组合在一起,并在一个命令 i.e 中运行 test .

运行所有包中的 analyzein: 在 script 局部创立以下命令:

analyze:
  run: melos exec -- flutter analyze .
  description: Run `dart analyze` in all packages.

这里没有什么特地的,您能够执行 melos 运行剖析来运行所有包中的剖析。

生成整个我的项目的代码 coverage: 为整个我的项目生成代码 coverage。我的项目中蕴含一个自定义脚本,即组合笼罩。嘘。这将基本上合并来自不同包的所有 lcov.info 文件到一个 lcov.info 文件中。而后,您能够应用此办法将 lcov.info 文件转换为 HTML。

https://stackoverflow.com/a/5…

#!/usr/bin/env bash

escapedPath="$(echo `pwd` | sed's/\//\\\//g')"

if grep flutter pubspec.yaml > /dev/null; then
  if [-d "coverage"]; then
    # combine line coverage info from package tests to a common file
    if [! -d "$MELOS_ROOT_PATH/coverage_report"]; then
      mkdir "$MELOS_ROOT_PATH/coverage_report"
    fi
    sed "s/^SF:lib/SF:$escapedPath\/lib/g" coverage/lcov.info >> "$MELOS_ROOT_PATH/coverage_report/lcov.info"
    rm -rf "coverage"
  fi
fi

在脚本局部上面写下以下命令:

gen_coverage: melos exec -- "\$MELOS_ROOT_PATH/combine_coverage.sh"

Path 会给出存储 MELOS.yaml 的门路即 root 我的项目。脚本执行结束后。您能够在我的项目中看到 coverage_report 文件夹。当初你有一个 lcov.info 文件,它会给你一个整个我的项目的报告。

最初,你的 melos.yaml 文件看起来像这样:

name: melos_demo

packages:
  - utility/**
  - features/**
  - "*"
scripts:
  test:selective_unit_test:
    run: melos exec --dir-exists="test" --fail-fast -- flutter test --no-pub --coverage
    description: Run Flutter tests for a specific package in this project.
    select-package:
      flutter: true
      dir-exists: test

  test:
    run: melos run test:selective_unit_test --no-select
    description: Run all Flutter tests in this project.

  analyze:
    run: melos exec -- flutter analyze .
    description: Run `dart analyze` in all packages.

  gen_coverage: melos exec -- "\$MELOS_ROOT_PATH/combine_coverage.sh"

图形用户界面选项

如果您不心愿通过终端执行这些命令,并心愿应用 GUI 运行它们,那么 Melos 能够满足您的要求。增加所有命令后,能够再次运行疏导程序命令。这将生成一些配置,你能够看到一些图形用户界面选项如下:

当初您能够执行所有这些命令,而无需在终端中键入任何内容。

Next Steps

这只是冰山一角。你能够在 Melos 网站上学到更多的过滤选项和命令。心愿你喜爱这篇文章。


© 猫哥

https://ducafecat.tech/

https://github.com/ducafecat

往期

开源

GetX Quick Start

https://github.com/ducafecat/…

新闻客户端

https://github.com/ducafecat/…

strapi 手册译文

https://getstrapi.cn

微信探讨群 ducafecat

系列汇合

译文

https://ducafecat.tech/catego…

开源我的项目

https://ducafecat.tech/catego…

Dart 编程语言根底

https://space.bilibili.com/40…

Flutter 零根底入门

https://space.bilibili.com/40…

Flutter 实战从零开始 新闻客户端

https://space.bilibili.com/40…

Flutter 组件开发

https://space.bilibili.com/40…

Flutter Bloc

https://space.bilibili.com/40…

Flutter Getx4

https://space.bilibili.com/40…

Docker Yapi

https://space.bilibili.com/40…

退出移动版