原文地址:medium.com/flutter-com…

原文作者:sagarsuri56.medium.com/

发布时间:2021年6月5日 – 7分钟阅读

大多数情况下,当您创建一个Flutter项目时。你用一个单一的包工作。该项目由一个pubspec.yaml、lib文件夹组成。你把你所有的功能和实用程序放在同一个包里。但也有一些项目将他们的功能和实用程序分成多个包。这有助于更好地分离关注点,并允许团队对他们的一些包进行开源。下面是一个多包项目的示意图。

[Flutter翻译]用Melos管理多包Flutter项目

在这里,我们把项目分为三层。第一层是根项目,它将持有适用于项目中所有不同包的通用配置。第二层是具有独立功能的包,它们之间不相互依赖。第三层由用于多个功能包的实用程序包组成。我不会深入探讨如何创建或构造一个多包的flutter项目。本文将重点讨论解决多包flutter项目中通常面临的一个特殊挑战。

挑战

在一个单包flutter项目中,运行以下任务是非常简单的。

  1. flutter pub get
  2. flutter tset
  3. flutter analyze
  4. 生成代码覆盖率,即 flutter test –coverage

但是在一个多包的flutter项目中运行同样的任务会很有挑战性,因为您需要在项目中的每个包中运行这些任务,并在任务完成后给出一个总结性的结果。现在我们知道挑战是什么了。让我们来讨论一下有哪些可能的解决方案。

解决方案

有两种可能的解决方案来解决这个挑战。让我们看看第一种。

  1. 为各种任务编写bash脚本。

这绝对是一个解决方案,但不是一个聪明的解决方案。你需要先写一个脚本,找出你项目中的所有包,并在其中运行上述任务之一。你还需要确保你以漂亮的格式显示输出,使事情可读。如果你更喜欢GUI,那么你需要在你的IDE中创建某种配置,通过GUI运行你的脚本。

  1. 将Melos集成到你的项目中。

这是一个比第一个方案更聪明的方案,我强烈推荐。因此,让我们详细讨论一下Melos是什么,以及如何将它集成到你的多包项目中。

Melos的介绍

Melos是一个CLI工具,用于管理多包的Flutter/Dart项目。

Melos是由Flutter社区的一个知名团队开发的,即invertase。你可以在他们的网站上详细了解Melos,但这里是Melos提供的一个快速功能列表。

  • 自动生成版本和更新日志。
  • 自动发布软件包到pub.dev。
  • 本地软件包的链接和安装。
  • 同时执行各软件包的命令。
  • 列出本地软件包和它们的依赖关系。

现在让我们看看如何使用Melos执行上述所有任务。

注意:如果你想边做边学,请下载启动项目。在另一个分支,你可以找到项目的最终版本。

安装Melos

让我们先安装Melos。我假设你已经安装了Flutter SDK,并将Flutter和Dart的路径设置为bash_profile 。在你的终端中运行以下命令。

dart pub global activate melos

你可以从上面的图片中复制该命令

下一步是在你的IDE中打开你的启动项目。我更喜欢使用Intellij,并且会向你展示Melos提供的一些很棒的GUI功能。项目的结构应该如下所示。

[Flutter翻译]用Melos管理多包Flutter项目

现在创建一个名为melos.yaml的文件,作为你的根应用程序。并复制以下内容到其中。

name: melos_demo
packages:
  - utility/**
  - features/**
  - '*'

你可以从上面的图片中复制代码

让我们来理解上述脚本。 a) name:你必须给出你的项目的名称。你可以在根项目的pubspec.yaml里面找到它。 b) pacakge:这个列表应该包含你项目中各个包的路径。每个路径可以使用glob模式扩展格式来定义。

Melos Bootstrap

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

melos bootstrap

请确保从根项目内部运行此命令

运行上述命令后,您应该看到以下输出。

[Flutter翻译]用Melos管理多包Flutter项目

你可以在这里阅读为什么你需要引导Melos。准确地说,它是你在项目中设置Melos或在项目中进行清理时应该执行的重要命令之一。

Melos Clean

当你想从你的项目中删除临时文件(构建工件,pub文件等)时,你可以执行这个命令。这个命令看起来是这样的。

melos clean

你可以从上面的图片中复制这个命令

命令

现在你将创建不同的命令来实现我们在文章开头提到的任务。

a. 在特定包中运行测试用例:

在你的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

上图中的颜色看起来很奇怪。归咎于carbon.now.sh

让我们了解一下上述脚本中发生了什么。

  1. 你已经创建了一个自定义脚本,即test:selective_unit_test,一旦执行就会显示一个选项,选择你想运行的单元测试的包。
  2. Melos提供了强大的过滤选项来选择符合过滤条件的软件包。在上面的脚本中,你使用 --dir-exists="test" 作为过滤选项。这将过滤所有包含testfolder的软件包。你可以在他们的网站上找到更多的过滤选项。
  3. --fail-fast将在遇到失败的测试案例时立即终止脚本的执行。
  4. 你可以通过使用描述部分给每个脚本一个人类可读的描述
  5. 你一定在想,为什么要把这个命令命名为test:selective_unit_test 。下一条命令将回答你的问题。
  6. 你可以详细阅读melos exec的作用。基本上,它将在你的项目中的每个包中执行命令或脚本。

现在运行下面的命令。

melos run test:selective_unit_test

你可以从上面的图片中复制该命令

你会看到下面的输出。

[Flutter翻译]用Melos管理多包Flutter项目

上面的命令能够找出包含test文件夹的这些包。输入2作为选项,你将看到以下输出。

[Flutter翻译]用Melos管理多包Flutter项目

b. 运行所有包中的测试案例:

现在编写以下命令,它将运行项目中的所有单元测试用例。这不会提示任何选项选择。

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

让我们讨论一下上述命令的作用。

  1. 这条命令基本上是以–no-select作为参数来运行前面的命令。这意味着,运行所有的单元测试。
  2. 你可以使用melos run test来运行这个命令。你把这个命令命名为test,因为可以有多个test命令的变体,就像你在上一步创建的test:selective_unit_test。你还可以创建更多的变体,如test:e2e_test , test:bdd_test等。你可以把所有的变体结合在一起,在一个单一的命令中运行,即test。

c. 运行所有软件包的分析:

在脚本部分创建以下命令。

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

你可以从上面的图片中复制这个脚本

这里没有什么花哨的东西。你可以执行melos run analyze来运行所有软件包中的analyze。

d. 生成整个项目的代码覆盖率:

为了生成整个项目的代码覆盖率。项目中包含一个自定义脚本,即 combine_coverage.sh 。这基本上会将所有来自不同包的lcov.info文件合并为一个lcov.info文件。然后你可以用这个方法把lcov.info文件转换成HTML

#!/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"

你可以从上面的图片中复制该脚本

MELOS_ROOT_PATH将给你一个存放melos.yaml的路径,即根项目。脚本的执行完成后。你可以看到项目中的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选项

如果你不想通过终端执行这些命令,而想用GUI来运行它们,那么Melos为你提供了保障。添加完所有的命令后,你可以再次运行bootstrap命令。这将产生一些配置,你可以看到一些像这样的GUI选项。

[Flutter翻译]用Melos管理多包Flutter项目

现在你可以执行所有这些命令,不需要在终端输入任何东西。

接下来的步骤

这只是冰山一角。你可以从Melos网站上了解更多的过滤选项和命令。希望你喜欢这篇文章。请在Twitter和LinkedIn上与我联系。保持安全,保持健康。


www.deepl.com 翻译