猫哥说
我正在的写的新闻客户端代码模板,只是适宜最多 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 我的项目中运行雷同的工作是具备挑战性的,因为你须要在我的项目中的每个包中运行这些工作,并在工作实现后给出总结后果。当初咱们晓得挑战是什么了。让咱们来讨论一下解决这个问题的可能办法。
解决方案
有两种可能的解决方案来解决这个问题。让咱们看看第一个:
- 为各种工作编写 bash 脚本
这相对是一个解决方案,但不是一个理智的解决方案。您须要首先编写一个脚本,找出我的项目中的所有包,并在其中运行上述工作之一。您还须要确保以丑陋的格局显示输入,以使内容具备可读性。如果您更喜爱 GUI,那么您须要在 IDE 中创立某种配置,以便通过 GUI 运行脚本
- 将 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,一旦执行,它会显示一个选项来抉择一个你想要运行的单元测试包。
- 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.
让咱们讨论一下下面的命令是做什么的:
- 这个命令将基本上运行上一个命令 –no-select as an argument. 这意味着运行所有的单元测试
- 你能够应用 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…