一个 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.xml1主 manifest:只含框架主工程 cordova-openharmony(跟踪 develop 分支)
default_master.xml1主工程 master 分支版本
cordova_<plugin>.xml78每个插件一份独立 manifest
cordova_<plugin>_master.xml78各插件 master 分支版本
README.md1组织介绍 + 全部插件仓库地址表

两类 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 CLIhcordova plugin add cordova-plugin-camera应用开发者,按需装插件,自动完成工程注入
repo manifestrepo 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)是低成本、高收益的候选工作。


五、踩坑与注意事项

#点说明
1repo 不在系统 PATHmacOS brew install repo,Linux 发行版多有打包
2manifest fetch 地址必须是平台可达的本仓库原指向 gitcode.com 时,AtomGit 用户 repo sync 全部失败——链接与托管平台一致性是 manifest 仓库的生命线(本次 PR #9 修复的正是这一点)
3-m 参数指定 manifest 文件不指定默认读 default.xml;拉插件要用 -m cordova_<plugin>.xml
4插件独立 manifest 不含主工程单插件 manifest 只有该插件仓库,需要框架源码时用 default.xml
5review 字段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,才算真正进入这个生态的分发体系。


参考文档

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐