# 打包与发布指南 本仓库提供三套打包脚本,分别用于**主框架整站升级包**、**单个插件市场包**、**批量插件市场包**。 三者均已支持**自动递增版本号**,并配套「框架在线升级的数据库变更」机制。 > 部署(中心站 / 客户端如何对接)不在本文范围,参见 `docs/DEPLOY_INTEGRATION.md`。 ## 0.0 产物与用途总览 `package_framework.php` **一次运行同时产出三个文件**;插件包由独立脚本产出: | 产物 | 来源命令 | 输出位置 | 用途 | | --- | --- | --- | --- | | 框架整包 `ywxapp-.zip` | `package_framework.php` | `build/framework/` | 框架升级(整站覆盖) | | 框架补丁 `ywxapp--patch.zip` | `package_framework.php` | `build/framework/` | 框架增量升级(`from_version` 起 git diff) | | 完整安装包 `ywxapp--install.zip` | `package_framework.php` | `build/framework/` | **新站首次部署**(白名单:app/config/extend/public/ywxapp/route + 根文件;不含插件、不含真实 `.env`/`database.php`/`ywxapp.php`,内置 `.env` 占位模板) | | 插件市场 zip + 测试 SQL | `package_all_addon.php` / `package_appmarket_addon.php` | `build/addon/`、`build/sql/` | 上传到应用市场后台,供客户机**后台购买后下载安装** | > ⚠️ **重要约定** > - 框架整包与完整安装包**都刻意不含 `addon/` 插件目录**(整包经 `includeDirs` 排除;安装包用白名单 + 排除 `public/static/<插件>/`、`public/addon/`)。全新部署框架后,插件需经后台应用市场**独立下载安装**,不要把插件打进框架包。 > - `package_install.php` 已废弃并合并进 `package_framework.php`(安装包产物由后者统一产出),请勿再单独调用。 > - 插件走「后台购买 → 下载 → 安装」的在线分发链路,与框架整包互相独立,二者不要混包。 --- ## 0. 版本号来源(重要) | 产物 | 版本号来源 | 是否进包 | 写回位置 | |---|---|---|---| | 主框架整站包 | `config/ywxapp.php` 第 37 行 `version` | 不进包(被排除) | `config/ywxapp.php` | | market 插件包 | `addon/appmall/info.php` 的 `version` | 不进包(随插件本身) | `addon/appmall/info.php` | | 其他插件包 | `addon//info.php` 的 `version` | 不进包(随插件本身) | `addon//info.php` | - **框架版本与各插件版本互相独立**,各自维护、各自递增。 - 打包脚本每次都会把新版本**写回对应文件**,保证下次打包在此基础上再 `+1`。 - 写回会改动 git 跟踪文件,属预期行为;但该文件被排除在升级包外,不会覆盖客户机。 --- ## 1. 主框架整站升级包 — `scripts/package_framework.php` 生成「整站升级包」(含 `app/config/extend/ywxapp/public/route` + 根文件 `think/composer.json/README.md/LICENSE.txt`), 客户端 `ywxapp/service/FrameworkService::apply()` 解压即完成整站升级。 **产物**(`build/framework/`,非 Web 可访问): - `ywxapp-.zip` —— 整包(整站,**不含插件**) - `ywxapp--patch.zip` —— 增量补丁包(`from_version` = 基础版本) **安全排除**(绝不进包,避免覆盖客户机本地配置与数据): `runtime/`、`vendor/`、`data/`、`.git`、`public/uploads`、`config/database.php`、`config/ywxapp.php`、`.env`、`install.lock`、`addon/`(插件独立分发)。 ### 用法(支持自动递增版本号) ```bash # 不带版本号:自动按 patch +1(读 config/ywxapp.php 当前版本,写回新值) php scripts/package_framework.php # 按段递增 php scripts/package_framework.php minor # 如 1.0.2 -> 1.1.0 php scripts/package_framework.php major # 如 1.0.2 -> 2.0.0 # 显式指定新版本 php scripts/package_framework.php 1.2.3 ``` - `baseVersion` 为第二可选参数(升级起点/补丁基础版本),缺省取写回前的旧值。 - 打包前会跑 `regressionCheckConfigVersion()` 校验,拦截「写坏配置」的历史 bug 写法(若触发直接中断打包)。 ### 数据库升级 SQL 约定 若本次升级涉及数据库结构/数据变更,把**增量 SQL** 放到仓库 `ywxapp/upgrade.sql`: - 整站包包含 `ywxapp/` 目录,`upgrade.sql` 会自动打进包,解压后位于 `项目根/ywxapp/upgrade.sql`。 - `apply()` 解压完成后自动检测并执行(`coreDir/upgrade.sql` 或 `root/upgrade.sql`)。 - 按语句拆分(忽略 `--` 行注释与 `/* */` 块注释),用 `Db::connect()->execute()` 执行。 - **幂等**:已执行版本记入 `runtime/framework/sql_applied.json`(`版本:文件名` 为键),重复升级不重复执行;执行成功后会删除该 `upgrade.sql`。 - 执行失败抛 `数据库升级失败:...` 异常,由升级流程提示(文件已提前备份)。 - ⚠️ **无事务回滚**,SQL 须写成幂等(如 `CREATE TABLE IF NOT EXISTS`、`ADD COLUMN IF NOT EXISTS`),并在预发环境先验证。 --- ## 2. 单个插件市场包 — `scripts/package_appmarket_addon.php` 把本地插件打包成市场 zip(结构对齐 `AddonService::package()`):`addon//` 为 zip 根,`public/static/addon//` 为 `static/` 前缀。 并生成 `wxapp_appmarket_addon_list` 测试记录 SQL(用于往中心站插一条数据,便于联调)。 **产物**: - `build/addon/-.zip` - `build/sql/--appmarket_addon_list.sql`(测试记录,`file_path` 为本地绝对路径,中心站部署时需改成实际路径或走后台上传) ### 用法(支持自动递增版本号) ```bash # 不带版本号:自动按 patch +1(读 addon//info.php 当前版本,写回新值) php scripts/package_appmarket_addon.php appmall # 按段递增 php scripts/package_appmarket_addon.php appmall minor # 1.0.1 -> 1.1.0 # 显式指定 php scripts/package_appmarket_addon.php appmall 1.2.0 # 兼容旧式(带标题等可选参数,version 缺省则按 patch 自动递增) php scripts/package_appmarket_addon.php mqttbroker "MQTT代理" "" "基于 Workerman 自研 MQTT Broker" 0 ``` - 版本参数位于 `$argv[2]`:若匹配 `x.y.z` 或 `major|minor|patch`,则视为版本参数,其后 `title/author/description/price` 整体左移一位,保持旧调用兼容。 --- ## 3. 批量插件市场包 — `scripts/package_all_addon.php` 一次性打包 `addon/` 下所有插件。 **产物**:`build/addon/-.zip` + `build/sql/--appmarket_addon_list.sql`(每个插件一份)。 ### 用法 ```bash # 不带 bump:按各插件 info.php 当前版本打包,不改版本号(安全、可重复执行) php scripts/package_all_addon.php # bump:每个插件版本按 patch +1 并写回各自 info.php(发版用) php scripts/package_all_addon.php bump # 跳过指定插件(与 bump 可组合) php scripts/package_all_addon.php skip:market php scripts/package_all_addon.php bump skip:market ``` > ⚠️ `bump` 会修改所有被打包插件的 `info.php` 版本号。日常只想重新生成 zip 时**不要带 `bump`**。 --- ## 4. 典型发版流程 ```bash # 1) 框架整站升级(自动 +1,含可选 upgrade.sql) php scripts/package_framework.php # 2) 中心站插件(market)发版(自动 +1) php scripts/package_appmarket_addon.php appmall # 3) 其余插件批量发版(各 +1) php scripts/package_all_addon.php bump ``` 1. 把 `build/framework/ywxapp-.zip`(整包)在中心站后台「主框架版本管理」上传并**发布**(客户端方可检测;该整包即**新站安装包**,不含插件)。 2. 把 `build/addon/*.zip` 在中心站「应用市场管理 / 插件审核」上传,或走后台「上传升级包」(客户机后台购买后下载安装)。 3. 涉及数据库变更时,确保打包前已把增量 SQL 写入 `ywxapp/upgrade.sql`(随包发布、升级时自动执行)。 --- ## 5. 常见问题 - **Q:怎么让每次打包版本号自动 +1?** A:框架包直接空参运行;插件包空参或带 `minor/major`;批量包带 `bump`。三者都会写回版本文件。 - **Q:框架升级改了数据库表结构,客户机怎么同步?** A:把增量 SQL 放 `ywxapp/upgrade.sql`,随包发布,`apply()` 自动幂等执行(见第 1 节)。 - **Q:补丁包比整包大 / 变更很多?** A:补丁基于 git 工作树相对基础版本的 diff。若工作树相对某基线改动很多,补丁会偏大;先把代码提交到稳定基线后再打,补丁即为当次真实改动。 - **Q:打包提示 LF/CRLF 警告?** A:git `autocrlf` 噪声,非错误,可忽略。