Flutter大型项目架构:私有组件包管理

news2024/11/19 14:43:41

随着项目功能模块越来越多,怎么去管理这些私有组件包是一个不得不面对的问题,特别对于团队开发来讲,一些通用的公共组件往往会在多个项目间使用,多的有几十个,每个组件包都有有自己的版本,组件包之间还有依赖关系,那么如何在团队内部共享私有组件包,控制依赖私有组件包的版本和组件包的更新维护,而且要确保其安全环境,也就是没有公网无法访问的安全环境,这些都是需要考虑的,如何去管理这些组件对提升开发效率和代码质量就显得尤为重要,那有日常开发中哪些的方式来管理私有组件库呢?本篇文章就来介绍一下。

主工程中管理组件

主工程新建一个 packages 目录,从主工程抽取出来的组件放在改目录下,目录结构如下图:

4881718430073_.pic.png

这种将组件分离到 packages 目录下更加简单直接,也可以实现模块化管理。但是由于所有代码都放在主工程的目录下,使用同一个 git 仓库,对于每个组件独立开发和维护不太方便,各组件的依赖关系也不是很明了,如主工程明明不需要直接依赖于 data 组件,但 data 组件的代码却在主工程的目录下面,两者之间本应该没有任何直接关系。

melos 管理组件

在之前的文章《Flutter大型项目架构:分层设计篇》中介绍了如何使用 melos 创建一个 workspace 来管理各个分层的组件包,有兴趣的话可以去翻一翻这篇文章。在大型项目中,这种方式可以让每个组件独立开发和维护,还可以借助 melos 编写各种编译指令,每个组件单独构建运行,组件间的依赖关系清晰明了。

4891718432664_.pic.png

melos 有一套独特的工作流程和命令方便单独建运行,同时也有一定的学习成本,尤其是对于小型项目来讲使用 melos 就显得有点复杂了,而且 melos 管理组件还是有一个同样的问题,那就是各组件和主工程使用同一个 git 仓库。如果想要组件使用独立的 git 仓库,该怎么做呢?

Github 或者 Gitlab

将组件上传到Github 或者 Gitlab 上,使用的时候直接在 podspec.yaml 文件中添加依赖,日常开发中也是比较常见的。

dependencies:
  library_name:
    git:
      url: git@github.com:username/library_name.git
      ref: dev

除了上面指定某个分支(如:dev),还可以特指标签(如 v1.0.0),或者具体的提交哈希值。

dependencies:
  library_name:
   git:
    url: https://github.com/username/library_name.git
    ref: e234072340    #commit reference id

可以看出如果使用 Github 或者 Gitlab 来管理 Flutter 组件包,需要手动管理版本标签或提交哈希,这是因为 Dartpub 工具不支持从 git 仓库自动解析版本号,只能指定具体的分支、标签或提交哈希,不能像从 pub.dev 获取包一样指定版本号(如 ^1.0.0)。如果使用私有仓库,还需要付费订阅私有仓库的服务。

第三方平台托管

用过比较多的就是 OnePub ,一个专门用于管理和发布 DartFlutter 包的第三方平台,旨在提供更灵活的包管理功能,尤其是对于私有包和团队协作来说,不仅可以将 Dart/Flutter 包发布到私有存储库、在项目中添加依赖,还可以与同事共享私有包
有界面来搜索公共和私有包,通过电子邮件向团队发送新包版本的通知,与 pub 工具无缝集,将 OnePub 集成到 CI/CD 管道中,自动化包的发布和管理过程等等功能。而且还有2个成员25个 packages 的范围内免费使用,是不是很香,不想去折腾的话使用 OnePub 还是不错的。

使用第三方平台托管还有有其它的选择,如CloudsmithJFrogJetBrains Space 等,Cloudsmith 除了支持 DartFlutter 包管理和分发,平台还支持超过 20 种包格式,包括 DockernpmPythonMavenRubyGems 等,适合使用多种语言的中、大型团队。

5021721891883_.pic.png

搭建自定义包服务器

dart pub 是支持自定义的第三方包存储库的,但是自行搭建的话,要处理如安全性(数据加密认证和授权)、存储方案、API 的设计、插件包的版本解析和版本控制、服务器和包管理系统与最新的 FlutterDart 版本兼容性等等方面的问题,这么一套操作下来太费时费力,如果没有运维的做技术支持的话,很难推行下去,那有没有其它的现成的方案呢?

这里推荐使用之前字节开源的 unpub,使用 MongoDB 作为默认数据库,模拟了 pub.dev 的功能,也能托管自己的包存储库。以下代码在本地开启一个 server,元信息数据存储在本地的 mongodb,包文件存在本地的 unpub-packages 文件夹中。

import 'package:mongo_dart/mongo_dart.dart';
import 'package:unpub/unpub.dart' as unpub;

main(List<String> args) async {
  final db = Db('mongodb://localhost:27017/dart_pub');
  await db.open(); // make sure the MongoDB connection opened

  final app = unpub.App(
    metaStore: unpub.MongoStore(db),
    packageStore: unpub.FileStore('./unpub-packages'),
  );

  final server = await app.serve('0.0.0.0', 4000);
  print('Serving at http://${server.address.host}:${server.port}');
}

同时,作者还提供将服务部署到 AWS 的插件包,只需修改 packageStore 参数即可。使用自定义的包存储库时,在你的 Flutter 项目中编辑 pubspec.yaml 文件,添加你的自定义包服务器作为一个新的包源。

dependencies:
  my_custom_package:
    version: ^0.0.1
    hosted:
      name: your_custom_server_name
      url: https://your-custom-server-url.com/packages

小结

以上列出来的几种组件包管理方式各有优劣,直接放在主工程中是最简单直接但是独立开发和维护不太方便;melos 管理组件可以独立开发维护却要学习相关的指令;git 能做到独立仓库管理但不支持自动解析版本;搭建自定义包服务器似乎是终极解决方案但需要额外部署和维护一个包服务器;第三方平台托管貌似没有前面面临的问题但托管包的数量有限,超出限制要收费,当然预算充足的话就不是问题。怎么选择就需要根据项目的复杂度和团队的情况,目前本人项目中大都使用的是 melos 来管理组件,那么你使用的是哪种方式呢?或者有没有其它更好的方式来管理项目中的组件?欢迎来分享和交流一下!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1955163.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AI的欺骗游戏:揭示多模态大型语言模型的易受骗性

人工智能咨询培训老师叶梓 转载标明出处 多模态大型语言模型&#xff08;MLLMs&#xff09;在处理包含欺骗性信息的提示时容易生成幻觉式响应。尤其是在生成长响应时&#xff0c;仍然是一个未被充分研究的问题。来自 Apple 公司的研究团队提出了MAD-Bench&#xff0c;一个包含8…

漏洞复现-F6-11泛微-E-Cology-SQL

本文来自无问社区&#xff0c;更多漏洞信息可前往查看http://www.wwlib.cn/index.php/artread/artid/15575.html 0x01 产品简介 泛微协同管理应用平台e-cology是一套企业级大型协同管理平台 0x02 漏洞概述 该漏洞是由于泛微e-cology未对用户的输入进行有效的过滤&#xff0…

CentOS_7.9历史版本官网下载

文章目录 1. 官网下载1.1. 打开官网1.2. download1.3. Older Versions-click here1.4. RPMs1.5. Vault mirror1.6. 7.9.2009/1.7. isos1.8. x86_641.9. 选择安装包下载 2. 阿里云镜像站下载 1. 官网下载 下载地址(如果下载地址已失效&#xff0c;参考下面的步骤) iso是安装包…

【前端】一文带你了解 CSS

文章目录 1. CSS 是什么2. CSS 引入方式2.1 内部样式2.2 外部样式2.3 内联样式 3. CSS 常见选择器3.1 基础选择器3.1.1 标签选择器3.1.2 类选择器3.1.3 id 选择器3.1.4 通配符选择器 3.2 复合选择器3.2.1 后代选择器 4. CSS 常用属性4.1 字体相关4.2 文本相关4.3 背景相关4.4 设…

基于sklearn的机器学习 — 决策树与随机森林

基于树的学习算法是一种广泛而流行的非参数、有监督的分类和回归方法。 基于树的学习算法的基础是决策树&#xff08;decision tree&#xff09;&#xff0c;它将一系列决策规则串联起来&#xff0c;看起来像一棵倒立的树&#xff0c;第一条决策规则位于树顶&#xff0c;称之为…

第十四篇——军争篇:怎样在行军中设计战场

目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么&#xff1f; 四、总结五、升华 一、背景介绍 通过不利的战场&#xff0c;用方式方法&#xff0c;让战场逐渐转化成对自…

[JS]同事:这次就算了,下班回去赶紧补补内置函数,再犯肯定被主管骂

【版权声明】未经博主同意&#xff0c;谢绝转载&#xff01;&#xff08;请尊重原创&#xff0c;博主保留追究权&#xff09; https://blog.csdn.net/m0_69908381/article/details/140754278 出自【进步*于辰的博客】 参考笔记一&#xff0c;P10.4、P13.2&#xff1b;笔记三&am…

城市交通工具目标检测数据集自行车、公交车、小汽车、行人

数据整理不易&#xff0c;下载地址点这里&#xff1b; yolo格式数据集之交通工具检测5种&#xff1b; 数据集已划分好|可以直接使用|yolov5|v6|v7|v8|v9|v10通用&#xff1b; 本数据为交通工具检测检测数据集&#xff0c;数据集数量如下&#xff1a; 总共有:6633张 训练集&…

尚庭公寓(四)

房间基本属性管理共有五个接口&#xff0c;分别是**保存或更新属性名称**、**保存或更新属性值**、**查询全部属性名称和属性值列表**、**根据ID删除属性名称**、**根据ID删除属性值**。下面逐一是实现。 首先在AttrController中注入AttrKeyService和AttrValueService&#xf…

计数器与阻塞队列

目录 一&#xff1a;阻塞队列 模拟阻塞队列 二&#xff1a;线程池&#xff1a; 三&#xff1a;计数器&#xff1a; 定时器模拟实现 一&#xff1a;阻塞队列 阻塞队列是在原有的普通队列上做了扩充&#xff0c;标准库中原有的队列和子类都是线程不安全的。 1.线程安全 2.…

OSMDroidOfflineDemo源码调试记录

文章目录 源码下载环境配置尝试不同离线加载遇到的问题 尝试安卓端加载离线地图&#xff0c;下载了使用osmdroid的离线版项目源码&#xff0c;更改JDK环境、gradle环境&#xff0c;一顿操作下来&#xff0c;踉踉跄跄的把程序跑起来了&#xff0c;但是离线的地图一直加载不出来。…

49.TFT_LCD液晶屏驱动设计与验证(2)

&#xff08;1&#xff09;Visio视图&#xff1a; &#xff08;2&#xff09;控制模块Verilog代码&#xff1a; module tft_ctrl(input clk_33M ,input reset_n ,input [23:0] data_in ,output [9:0] hang…

如何使用 SQLite ?

SQLite 是一个轻量级、嵌入式的关系型数据库管理系统&#xff08;RDBMS&#xff09;。它是一种 C 库&#xff0c;实现了自给自足、无服务器、零配置、事务性 SQL 数据库引擎。SQLite 的源代码是开放的&#xff0c;完全在公共领域。它被广泛用于各种应用程序&#xff0c;包括浏览…

Python | ValueError: could not convert string to float: ‘example’

Python | ValueError: could not convert string to float: ‘example’ 在Python编程中&#xff0c;类型转换是一个常见的操作。然而&#xff0c;当尝试将一个字符串转换为浮点数时&#xff0c;如果字符串的内容不是有效的浮点数表示&#xff0c;就会遇到“ValueError: could…

【python_将一个列表中的几个字典改成二维列表,并删除不需要的列】

def 将一个列表中的几个字典改成二维列表(original_list,headersToRemove_list):# 初始化一个列表用于存储遇到的键&#xff0c;保持顺序ordered_keys []# 遍历data中的每个字典&#xff0c;添加其键到ordered_keys&#xff0c;如果该键还未被添加for d in original_list:for …

SpringCloud之@FeignClient()注解的使用方式

FeignClient介绍 FeignClient 是 Spring Cloud 中用于声明一个 Feign 客户端的注解。由于SpringCloud采用分布式微服务架构&#xff0c;难免在各个子模块下存在模块方法互相调用的情况。比如订单服务要调用库存服务的方法&#xff0c;FeignClient()注解就是为了解决这个问题的…

Vim 文本编辑工具

Vim 基础命令 一、Vim 命令速查 Vim 是一款功能强大的文本编辑器&#xff0c;广泛应用于Linux系统中。以下是一些基础但非常有用的Vim命令&#xff0c;它们将帮助你更高效地使用Vim。 使用单个字母键通常需要进一步的输入以形成完整命令。特殊符号用来表示操作的位置。 命令…

Linux网络:传输层TCP协议(四)拥塞控制及延迟应答

目录 一、拥塞控制 二、延迟应答 一、拥塞控制 虽然 TCP 拥有滑动窗口这个大杀器机制来根据具体情况对发送的数据大小和速度进行实时控制, 能够高效并且可靠的发送大量的数据. 但是如果在双方建立好连接后的刚开始阶段就发送大量的数据。仍然可能引发一些问题. 因为同一个网…

【2024蓝桥杯/C++/A组/团建】

题目 代码 #include<bits/stdc.h> using namespace std;const int N 2e510;int a[N], b[N]; int ans; vector<int> Ga[N], Gb[N];void dfs(int ap, int af, int bp, int bf, int dep) {ans max(ans, dep);map<int, int> bk;for(auto ason : Ga[ap])if(aso…

免费【2024】springboot 程序设计基础视频学习系统的设计与实现

博主介绍&#xff1a;✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术范围&#xff1a;SpringBoot、Vue、SSM、HTML、Jsp、PHP、Nodejs、Python、爬虫、数据可视化…