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

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

主工程中管理组件

主工程新建一个 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.gitref: dev

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

dependencies:library_name:git:url: https://github.com/username/library_name.gitref: 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 openedfinal 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.1hosted:name: your_custom_server_nameurl: https://your-custom-server-url.com/packages

小结

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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一篇文章带你入门爬虫并编写自己的第一个爬虫程序

一、引言 目前我们处在一个信息快速迭代更新的时代&#xff0c;海量的数据以大爆炸的形式出现在网络之中&#xff0c;相比起过去那个通过广播无线电、书籍报刊等传统媒介获取信息的方式&#xff0c;我们现在通过网络使用搜索引擎几乎可以获得任何我们需要的信息资源。 但与此同…

Vue前端工程

创建一个工程化的vue项目 npm init vuelatest 全默认回车就好了 登录注册校验 //定义数据模型 const registerDataref({username:,password:,rePassword: }) //校验密码的函数 const checkRePassword(rule,value,callback)>{if (value){callback(new Error(请再次输入密…

python基础知识点

最近系统温习了一遍python基础语法&#xff0c;把自己不熟知的知识点罗列一遍&#xff0c;便于查阅~~ python教程 Python 基础教程 | 菜鸟教程 1、python标识符 以单下划线开头 _foo 的代表不能直接访问的类属性&#xff0c;需通过类提供的接口进行访问&#xff0c;不能用 f…

c++STL容器中vector的使用,模拟实现及迭代器使用注意事项和迭代器失效问题

目录 前言&#xff1a; 1.vector的介绍及使用 1.2 vector的使用 1.2 1 vector的定义 1.2 2 vector iterator&#xff08;迭代器&#xff09;的使用 1.2.3 vector 空间增长问题 1.2.4 vector 增删查改 1.2.5vector 迭代器失效问题。 2.vector模拟实现 2.1 std::vect…

大彩触摸屏与单片机通讯

目录&#xff1a; 一、概述 1、触摸屏简介 2、安装软件 1&#xff09;设置VSPD软件 2&#xff09;设置VisualTFT软件 3&#xff09;设置串口软件 二、单片机发送指令给触摸屏 1、发送文本 2、显示与隐藏控件 1&#xff09;通过指令助手生成指令 2&#xff09;隐藏…

实现Obsidian PC端和手机端(安卓)同步

步骤 1&#xff1a;在PC端设置Obsidian 安装Obsidian和Git&#xff1a;确保你的PC上已经安装了Obsidian和Git。你可以从Obsidian官网和Git官网下载并安装。 克隆GitHub代码库&#xff1a;在PC上打开命令行&#xff08;例如Windows的命令提示符或Mac/Linux的终端&#xff09;&a…

Redis 初步认识

目录 1. 概述 2. 数据结构 3. 使用方式 4. 优势 1. 概述 Redis &#xff08;Remote Directory Server&#xff09;是一个开源的基于内存的数据存储系统&#xff1b; 可以用作数据库缓存和消息队列等各种场景&#xff0c;也是目前最热门的 NoSQL 数据库之一&#xff1b; 早…

LeetCode3. 无重复字符的最长子串(java实现)

今天分享的题目是LeetCode3. 无重复字符的最长子串&#xff0c;来看题目描述&#xff1a; 无重复的最长子串&#xff0c;题目有可能有些小伙伴没读太懂&#xff0c;其实就是找到不重复的最长子串&#xff0c;比如eg3&#xff0c;pwwk&#xff0c;那么w出现了两次就不符合要求。…

Spring源码- context:component-scan base-package标签的作用源码解析

1.扫描包路径下所有的类加载解析成bean定义信息 ClassPathBeanDefinitionScanner .doScan方法调用路径 doScan:276, ClassPathBeanDefinitionScanner (org.springframework.context.annotation) parse:95, ComponentScanBeanDefinitionParser (org.springframework.context.a…

C语言第九天笔记

数组的概念 什 么是数组 数组是 相同类型&#xff0c; 有序数据的集合。 数 组的特征 数组中的数据被称为数组的 元素&#xff0c;是同构的 数组中的元素存放在内存空间里 (char player_name[6]&#xff1a;申请在内存中开辟6块连续的基于char类 型的变量空间) 衍生概念&…

ClkLog:开源用户行为分析框架,让数据分析更轻松

ClkLog&#xff1a;开源用户行为分析框架&#xff0c;让数据分析更轻松 在数据驱动的时代&#xff0c;找到一个好用的用户行为分析工具真是难上加难。但是今天你有福了&#xff0c;开源免费的 ClkLog 就是你的不二选择&#xff01;本文将为你详细介绍 ClkLog 的功能特点、技术架…

【初阶数据结构篇】冒泡排序和快速排序(中篇)

文章目录 冒泡排序和快速排序前言代码位置冒泡排序快速排序递归法实现hoare版本挖坑法lomuto前后指针递归法复杂度分析 非递归法实现 冒泡排序和快速排序 前言 本篇以排升序为例 代码位置 gitee 冒泡排序 动图理解 作为第一个接触的排序算法&#xff0c;冒泡排序想必大…

OpenCV 图像处理 轮廓检测基本原理

文章目录 基本原理关键函数和参数注意事项 示例代码示例效果代码详解findContours 函数原型findContours函数变体 基本原理 轮廓发现是图像处理中的一个重要步骤&#xff0c;用于检测物体的边界和形状。 图像预处理&#xff1a; 轮廓发现通常在灰度图像上进行。因此&#xff0…

程序员转型AI大模型好转吗?成功率高吗?

前言 在程序员圈子中&#xff0c;技术转型近年来一直是热门话题。随着AI技术的迅猛发展&#xff0c;优秀人才短缺&#xff0c;程序员向AI大模型转型似乎成为了一条通往职场先机的路径。但是&#xff0c;这条转型之路是否容易走&#xff0c;成功率又如何呢&#xff1f; 一、程…

SSM大学生体质管理系统-计算机毕业设计源码75960

摘要 基于SSM的大学生体质管理系统是一款综合性平台&#xff0c;融合了在线课程、健康知识、体测报告等多项功能&#xff0c;旨在为广大大学生提供全方位的健康管理服务。通过在线课程和健康知识模块&#xff0c;用户可以随时学习健康知识&#xff0c;掌握科学的健康管理方法&a…

大屏自适应方案

1.npm下载 npm i autofit.js2.在项目中引入 import autofit from autofit.js3.init(&#xff09;初始化&#xff0c;注意&#xff1a;要在mounted&#xff08;&#xff09;里

通过阿里云OOS“快速设置”快速配置多地域运维任务

1. 介绍 什么是系统运维管理OOS? 系统运维管理OOS&#xff08;CloudOps Orchestration Service&#xff09;是阿里云提供的一项云上自动化运维服务&#xff0c;旨在帮助用户实现运维任务的自动化管理和执行。通过OOS&#xff0c;用户可以设计模板来详细定义执行任务的内容、…

微型丝杆弯曲:工件精度下降的隐形杀手!

微型丝杆作为精密机械部件&#xff0c;‌其弯曲或变形会对使用它进行加工的工件产生直接影响。在机械加工中&#xff0c;微型丝杆弯曲是一个不容忽视的问题&#xff0c;它会对工件造成多方面的损害。 1、加工精度受损&#xff1a;弯曲会直接导致工具的实际运动轨迹与程序设计的…

【软件建模与设计】-07-静态建模

目录 1、类之间关系 1.1、关联 1.1.1、关联的多重性 1.1.2、三元关联 1.1.3、一元关联 1.1.4、关联类 2、组合与聚合层次 2.1、组合 2.2、聚合 3、泛化/特化层次 4、约束 5、静态建模和UML 5.1、问题域的静态建模 6、系统上下文的静态建模 7、使用UML构造型对类…

【Python学习手册(第四版)】学习笔记12-if语句(and、or、三元表达式)详解

个人总结难免疏漏&#xff0c;请多包涵。更多内容请查看原文。本文以及学习笔记系列仅用于个人学习、研究交流。 本文较简单&#xff0c;对if语句的格式、示例、多路做了示例&#xff0c;以及真值测试&#xff08;and、or等&#xff09;介绍&#xff0c;最后介绍了三三元表达式…