一个 manifest 仓库背后的工程化:用 repo 管理近 80 个 Cordova 鸿蒙化三方库
一个 manifest 仓库背后的工程化:用 repo 管理近 80 个 Cordova 鸿蒙化三方库
本文聚焦其中最容易被忽视、却最能体现工程化思维的一个仓库——CPF-Cordova/manifest:它用 Android 生态的 repo 工具,把 1 个框架主工程 + 78 个三方插件仓库聚合为一键同步的代码集合
适合读者:需要批量管理多仓库生态的维护者、想一键拉取全部 Cordova 鸿蒙插件的迁移开发者。
一、manifest 仓库是什么
1.1 repo 工具与 manifest 的渊源
Android 开源项目(AOSP)有数百个 git 仓库,Google 为此创造了 repo 工具:用一个 XML manifest 文件描述"要拉哪些仓库、放哪个路径、跟踪哪个分支",然后:
repo init -u <manifest仓库地址>
repo sync
即可一次性克隆全部仓库并建立工作区。CPF-Cordova 把这套机制原样搬到了鸿蒙生态——manifest 仓库就是"Cordova 鸿蒙化全家桶"的目录索引。
1.2 仓库结构实测
manifest 仓库共 81 个 XML 文件 + 1 个 README,分四类:
| 文件 | 数量 | 作用 |
|---|---|---|
default.xml | 1 | 主 manifest:只含框架主工程 cordova-openharmony(跟踪 develop 分支) |
default_master.xml | 1 | 主工程 master 分支版本 |
cordova_<plugin>.xml | 78 | 每个插件一份独立 manifest |
cordova_<plugin>_master.xml | 78 | 各插件 master 分支版本 |
README.md | 1 | 组织介绍 + 全部插件仓库地址表 |
两类 manifest 的分工(default.xml 实测内容):
<?xml version="1.0" encoding="UTF-8"?><manifest>
<remote fetch="https://atomgit.com/CPF-Cordova/" name="origin" review="https://atomgit.com/CPF-Cordova/"/>
<default remote="origin" revision="master" sync-j="4"/>
<!-- 主工程 -->
<project groups="default" name="cordova-openharmony" path="cordova-openharmony" remote="origin" revision="develop"/>
</manifest>
default.xml→ 主工程 develop 分支(适配开发版)default_master.xml→ 主工程 master 分支(稳定版)
单插件 manifest(如 cordova_camera.xml)结构完全同构,只是 project 节点换成插件仓库:
<project groups="default" name="cordova-plugin-camera" path="cordova-plugin-camera" remote="origin" revision="develop"/>
每个文件都是自包含的:remote(fetch 地址 + review 地址)、default(分支策略 + 并发数)、project(仓库名 + 本地路径)三要素齐全,任意一个文件都能单独 repo init。
二、78 个三方库清单:存量 Cordova 生态的鸿蒙覆盖
以下清单从 78 份插件 manifest 与 README 插件表中提取,每个三方库均附 AtomGit 仓库地址(即 CPF-Cordova 组织的插件全集,名称取自 manifest/README 中文说明):
2.1 Apache 核心插件(官方 core plugins 对应)
| 插件 | 仓库地址 |
|---|---|
| 设备插件(cordova-plugin-device) | https://atomgit.com/CPF-Cordova/cordova-plugin-device |
| 对话框插件(cordova-plugin-dialogs) | https://atomgit.com/CPF-Cordova/cordova-plugin-dialogs |
| 电量信息查询(cordova-plugin-battery-status) | https://atomgit.com/CPF-Cordova/cordova-plugin-battery-status |
| 相机插件(cordova-plugin-camera) | https://atomgit.com/CPF-Cordova/cordova-plugin-camera |
| 媒体插件(cordova-plugin-media) | https://atomgit.com/CPF-Cordova/cordova-plugin-media |
| 媒体选择(cordova-plugin-media-capture) | https://atomgit.com/CPF-Cordova/cordova-plugin-media-capture |
| 本地文件管理插件(cordova-plugin-file) | https://atomgit.com/CPF-Cordova/cordova-plugin-file |
| 文件上传下载(cordova-plugin-file-transfer) | https://atomgit.com/CPF-Cordova/cordova-plugin-file-transfer |
| 地理定位插件(cordova-plugin-geolocation) | https://atomgit.com/CPF-Cordova/cordova-plugin-geolocation |
| 获取网络信息插件(cordova-plugin-network-information) | https://atomgit.com/CPF-Cordova/cordova-plugin-network-information |
| 震动插件(cordova-plugin-vibration) | https://atomgit.com/CPF-Cordova/cordova-plugin-vibration |
| 状态栏(cordova-plugin-statusbar) | https://atomgit.com/CPF-Cordova/cordova-plugin-statusbar |
| 启动屏(cordova-plugin-splashscreen) | https://atomgit.com/CPF-Cordova/cordova-plugin-splashscreen |
| 白名单(cordova-plugin-whitelist) | https://atomgit.com/CPF-Cordova/cordova-plugin-whitelist |
| 全球化插件(cordova-plugin-globalization) | https://atomgit.com/CPF-Cordova/cordova-plugin-globalization |
| 加速度传感器(cordova-plugin-device-motion) | https://atomgit.com/CPF-Cordova/cordova-plugin-device-motion |
| 陀螺仪传感器(cordova-plugin-device-orientation) | https://atomgit.com/CPF-Cordova/cordova-plugin-device-orientation |
| 通讯录插件(cordova-plugin-contacts) | https://atomgit.com/CPF-Cordova/cordova-plugin-contacts |
| 解压缩(cordova-plugin-zip) | https://atomgit.com/CPF-Cordova/cordova-plugin-zip |
2.2 社区热门三方插件(按能力域)
扫码
| 插件 | 仓库地址 |
|---|---|
| 扫码自定义屏幕(cordova-plugin-qrscanner) | https://atomgit.com/CPF-Cordova/cordova-plugin-qrscanner |
| 扫码插件(phonegap-plugin-barcodescanner) | https://atomgit.com/CPF-Cordova/phonegap-plugin-barcodescanner |
相册/媒体
| 插件 | 仓库地址 |
|---|---|
| 选择多张图片插件(cordova-plugin-imagepicker) | https://atomgit.com/CPF-Cordova/cordova-plugin-imagepicker |
| 选择多张图片(cordova-plugin-telerik-imagepicker) | https://atomgit.com/CPF-Cordova/cordova-plugin-telerik-imagepicker |
| 选择多张图片(cordova-plugin-mediapicker-dmcsdk) | https://atomgit.com/CPF-Cordova/cordova-plugin-mediapicker-dmcsdk |
| 选择照片/视频保存(cordova-plugin-photo-library) | https://atomgit.com/CPF-Cordova/cordova-plugin-photo-library |
| Canvas保存到相册(cordova-plugin-canvas2image) | https://atomgit.com/CPF-Cordova/cordova-plugin-canvas2image |
| 相机预览(cordova-plugin-camera-preview) | https://atomgit.com/CPF-Cordova/cordova-plugin-camera-preview |
存储
| 插件 | 仓库地址 |
|---|---|
| 数据库插件(cordova-sqlite-storage) | https://atomgit.com/CPF-Cordova/cordova-sqlite-storage |
| 数据库(cordova-sqlite-evcore-extbuild-free) | https://atomgit.com/CPF-Cordova/cordova-sqlite-evcore-extbuild-free |
| 持久化插件(cordova-plugin-nativestorage) | https://atomgit.com/CPF-Cordova/cordova-plugin-nativestorage |
| 文件MD5(cordova-plugin-file-md5) | https://atomgit.com/CPF-Cordova/cordova-plugin-file-md5 |
| uri转path(cordova-plugin-filepath) | https://atomgit.com/CPF-Cordova/cordova-plugin-filepath |
网络/浏览器
| 插件 | 仓库地址 |
|---|---|
| http请求(cordova-plugin-advanced-http) | https://atomgit.com/CPF-Cordova/cordova-plugin-advanced-http |
| 获取网络IP地址信息(cordova-plugin-networkinterface) | https://atomgit.com/CPF-Cordova/cordova-plugin-networkinterface |
| 内置浏览器(cordova-plugin-inappbrowser) | https://atomgit.com/CPF-Cordova/cordova-plugin-inappbrowser |
| ionic-webview(cordova-plugin-ionic-webview) | https://atomgit.com/CPF-Cordova/cordova-plugin-ionic-webview |
输入/窗口/UI
| 插件 | 仓库地址 |
|---|---|
| 键盘插件(cordova-plugin-keyboard) | https://atomgit.com/CPF-Cordova/cordova-plugin-keyboard |
| 键盘插件(cordova-plugin-ionic-keyboard) | https://atomgit.com/CPF-Cordova/cordova-plugin-ionic-keyboard |
| 导航栏插件(cordova-plugin-navigationbar) | https://atomgit.com/CPF-Cordova/cordova-plugin-navigationbar |
| 状态栏颜色(cordova-plugin-navigationbar-color) | https://atomgit.com/CPF-Cordova/cordova-plugin-navigationbar-color |
| spinner插件(cordova-plugin-spinnerdialog) | https://atomgit.com/CPF-Cordova/cordova-plugin-spinnerdialog |
| 全屏插件(cordova-plugin-fullscreen) | https://atomgit.com/CPF-Cordova/cordova-plugin-fullscreen |
| 内置浏览器一个分支(cordova-plugin-themeablebrowser) | https://atomgit.com/CPF-Cordova/cordova-plugin-themeablebrowser |
| toast插件(cordova-plugin-x-toast) | https://atomgit.com/CPF-Cordova/cordova-plugin-x-toast |
| 角标插件(cordova-plugin-badge) | https://atomgit.com/CPF-Cordova/cordova-plugin-badge |
| 屏幕方向(cordova-plugin-screen-orientation) | https://atomgit.com/CPF-Cordova/cordova-plugin-screen-orientation |
系统/安全
| 插件 | 仓库地址 |
|---|---|
| 授权插件(cordova-plugin-permission) | https://atomgit.com/CPF-Cordova/cordova-plugin-permission |
| 安卓授权(cordova-plugin-android-permissions) | https://atomgit.com/CPF-Cordova/cordova-plugin-android-permissions |
| 指纹的采集和使用(cordova-plugin-fingerprint-aio) | https://atomgit.com/CPF-Cordova/cordova-plugin-fingerprint-aio |
| 保持屏幕常亮(cordova-plugin-insomnia) | https://atomgit.com/CPF-Cordova/cordova-plugin-insomnia |
| 最小化/返回插件(cordova-plugin-backbutton) | https://atomgit.com/CPF-Cordova/cordova-plugin-backbutton |
| 退出APP(cordova-plugin-app-exit) | https://atomgit.com/CPF-Cordova/cordova-plugin-app-exit |
| 最小化插件(cordova-plugin-appminimize) | https://atomgit.com/CPF-Cordova/cordova-plugin-appminimize |
| 编译信息(cordova-plugin-buildinfo) | https://atomgit.com/CPF-Cordova/cordova-plugin-buildinfo |
| app版本插件(cordova-plugin-appversion) | https://atomgit.com/CPF-Cordova/cordova-plugin-appversion |
| app版本插件(cordova-plugin-app-version) | https://atomgit.com/CPF-Cordova/cordova-plugin-app-version |
| 获取配置参数信息(cordova-plugin-customconfigparameters) | https://atomgit.com/CPF-Cordova/cordova-plugin-customconfigparameters |
| 通用连接(cordova-plugin-deeplink) | https://atomgit.com/CPF-Cordova/cordova-plugin-deeplink |
| js文件注入(cordova-plugin-injectview) | https://atomgit.com/CPF-Cordova/cordova-plugin-injectview |
| 检测屏幕截图(cordova-plugin-detect-screenshot) | https://atomgit.com/CPF-Cordova/cordova-plugin-detect-screenshot |
| 禁止截图(cordova-plugin-privacyscreen) | https://atomgit.com/CPF-Cordova/cordova-plugin-privacyscreen |
通信/定位
| 插件 | 仓库地址 |
|---|---|
| 蓝牙插件(cordova-plugin-ble-central) | https://atomgit.com/CPF-Cordova/cordova-plugin-ble-central |
| 全局监听插件(cordova-plugin-broadcaster) | https://atomgit.com/CPF-Cordova/cordova-plugin-broadcaster |
| 百度地图定位(cordova-plugin-baidumaplocation) | https://atomgit.com/CPF-Cordova/cordova-plugin-baidumaplocation |
三方 SDK
| 插件 | 仓库地址 |
|---|---|
| 微信插件(cordova-plugin-wechat) | https://atomgit.com/CPF-Cordova/cordova-plugin-wechat |
| qq(cordova-plugin-qqsdk) | https://atomgit.com/CPF-Cordova/cordova-plugin-qqsdk |
| 微博(cordova-plugin-weibosdk) | https://atomgit.com/CPF-Cordova/cordova-plugin-weibosdk |
| 华为推送插件(cordova-plugin-huawei-push) | https://atomgit.com/CPF-Cordova/cordova-plugin-huawei-push |
| 激光推送(cordova-plugin-jcore) | https://atomgit.com/CPF-Cordova/cordova-plugin-jcore |
| 激光推送(jpush-phonegap-plugin) | https://atomgit.com/CPF-Cordova/jpush-phonegap-plugin |
分享/剪贴板/通知
| 插件 | 仓库地址 |
|---|---|
| 剪贴板(cordova-clipboard) | https://atomgit.com/CPF-Cordova/cordova-clipboard |
| 分享(cordova-plugin-x-socialsharing) | https://atomgit.com/CPF-Cordova/cordova-plugin-x-socialsharing |
| 本地通知插件(cordova-plugin-local-notification) | https://atomgit.com/CPF-Cordova/cordova-plugin-local-notification |
支付
| 插件 | 仓库地址 |
|---|---|
| 支付宝(cordova-plugin-adam-alipay) | https://atomgit.com/CPF-Cordova/cordova-plugin-adam-alipay |
| 支付宝(cordova-plugin-alipay-v2) | https://atomgit.com/CPF-Cordova/cordova-plugin-alipay-v2 |
热更新
| 插件 | 仓库地址 |
|---|---|
| 热更新插件(cordova-hot-code-push-plugin) | https://atomgit.com/CPF-Cordova/cordova-hot-code-push-plugin |
2.3 覆盖度点评
这份清单最值得注意的是中国本土化插件的全覆盖:微信、QQ、微博、支付宝、极光推送、华为推送、百度定位——这些是存量企业 Cordova 应用迁移的最大阻塞项,全部有了鸿蒙实现。配合热更新插件,企业可以在不上架应用市场的情况下持续交付 Web 层更新(Web 资源热更新在鸿蒙上的合规边界需自行评估)。
以上共 75 个三方库链接(19 个 Apache 核心插件 + 56 个社区/SDK 插件),全部为 AtomGit 实际可达地址;链接数据源为 manifest 仓库 README 插件表 + 78 份插件 manifest 的 project 节点交叉核对。
三、manifest 的正确打开方式
3.1 一键拉取全家桶
# 安装 repo(Android 生态通用工具)
# macOS: brew install repo
# 拉取主工程(develop 分支)
mkdir cordova-ohos && cd cordova-ohos
repo init -u https://atomgit.com/CPF-Cordova/manifest.git -m default.xml
repo sync -j8
# 或拉取某插件(如扫码)
repo init -u https://atomgit.com/CPF-Cordova/manifest.git -m cordova_camera.xml
repo sync
得到的目录结构直接就是可构建的相对布局,sync-j="4" 控制并发克隆数。
3.2 与 hcordova 工作流的关系
manifest 与 hcordova CLI 是两条互补的获取路径:
| 路径 | 命令 | 适合场景 |
|---|---|---|
| hcordova CLI | hcordova plugin add cordova-plugin-camera | 应用开发者,按需装插件,自动完成工程注入 |
| repo manifest | repo init + repo sync | 框架贡献者 / 插件适配者,需要批量读改多仓库源码 |
应用开发者日常用 hcordova 即可;当你要批量修改 78 个插件的公共问题(比如本次的 gitcode→atomgit 链接迁移),manifest + repo 的价值立刻显现:一个 manifest 工作区里所有仓库就位,批量脚本一遍跑完。
3.3 实战:链接迁移的批量化(本人实测记录)
manifest 仓库自身的 README 和 159 个 XML 里的 fetch 地址原来指向 gitcode.com,我们刚完成了整体迁移(Issue #1 + PR #9):
git clone https://atomgit.com/CPF-Cordova/manifest.git && cd manifest
git checkout -b docs/replace-gitcode-with-atomgit
# 批量替换(159 个文件 / 240 处 / 81 个唯一 URL)
grep -rl "gitcode" . --include="*.xml" --include="*.md" | \
xargs sed -i '' 's|gitcode\.com/CPF-Cordova/|atomgit.com/CPF-Cordova/|g'
# 验证:gitcode 残留 0
grep -rl "gitcode" . --include="*.xml" --include="*.md" | wc -l # → 0
这个案例本身就是 manifest 工程化价值的注脚:目录索引类仓库的链接必须与实际托管平台一致,否则 repo 用户第一步就会失败。
四、manifest 工程化的深层价值
4.1 多仓库生态的标准解法
近 80 个仓库的管理,摆在面前的选项有:monorepo(合并为单仓库)、submodule(git 子模块)、manifest(repo)。CPF-Cordova 选 manifest 的理由:
| 方案 | 优点 | 缺点 |
|---|---|---|
| monorepo | 原子提交、简单 | 78 个插件权限/发版耦合,克隆体积大 |
| git submodule | 原生 git | 更新繁琐,78 个 submodule 体验极差 |
| repo + manifest | 每仓库独立发版/权限;分支策略集中定义;partial clone | 需要装 repo 工具 |
对"每个插件独立版本、独立 issue、独立贡献者"的插件生态,repo 是唯一不牺牲独立性的方案。
4.2 分支策略:develop/master 双轨
每插件都有 _master.xml 变体,配合框架主工程的 develop/master 双分支,形成对齐的发布轨道:
default.xml(develop 轨道) default_master.xml(master 轨道)
│ │
适配中/预发布 已验证/稳定
使用方可以按需选择"追新"或"追稳",避免框架与插件版本错配。
4.3 对其他 CPF 组织的示范意义
CPF-Ionic 同样有 43 个插件仓库,目前尚无对应的 manifest 聚合。将 manifest 模式复制过去(ionic-default.xml + 43 份插件 manifest)是低成本、高收益的候选工作。
五、踩坑与注意事项
| # | 点 | 说明 |
|---|---|---|
| 1 | repo 不在系统 PATH | macOS brew install repo,Linux 发行版多有打包 |
| 2 | manifest fetch 地址必须是平台可达的 | 本仓库原指向 gitcode.com 时,AtomGit 用户 repo sync 全部失败——链接与托管平台一致性是 manifest 仓库的生命线(本次 PR #9 修复的正是这一点) |
| 3 | -m 参数指定 manifest 文件 | 不指定默认读 default.xml;拉插件要用 -m cordova_<plugin>.xml |
| 4 | 插件独立 manifest 不含主工程 | 单插件 manifest 只有该插件仓库,需要框架源码时用 default.xml |
| 5 | review 字段 | XML 里的 review="https://atomgit.com/CPF-Cordova/" 配合 repo upload 走 Gerrit 流程,AtomGit 上实际以 PR 为主,此字段可忽略 |
六、总结
manifest 仓库解决的是多仓库生态的"最后一公里"问题:
1. 聚合 ── 1 框架 + 78 插件,一个 XML 索引,repo sync 一键拉全
2. 双轨 ── develop/master 两套 manifest,适配与稳定版本并行
3. 独立 ── 每插件独立仓库独立发版,manifest 只管"在哪、跟哪个分支"
对迁移开发者:先读 manifest 清单确认你依赖的插件是否已适配(78 个覆盖了核心插件 + 微信/QQ/微博/支付宝/推送等本土刚需),再决定迁移方案;
对生态贡献者:新增插件适配后,记得在 manifest 仓库同步添加一份 cordova_<plugin>.xml——进了 manifest,才算真正进入这个生态的分发体系。
参考文档
更多推荐



所有评论(0)