Files
YwxAppThink/docs/打包与发布指南.md

163 lines
8.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 打包与发布指南
本仓库提供三套打包脚本,分别用于**主框架整站升级包**、**单个插件市场包**、**批量插件市场包**。
三者均已支持**自动递增版本号**,并配套「框架在线升级的数据库变更」机制。
> 部署(中心站 / 客户端如何对接)不在本文范围,参见 `docs/DEPLOY_INTEGRATION.md`。
## 0.0 产物与用途总览
`package_framework.php` **一次运行同时产出三个文件**;插件包由独立脚本产出:
| 产物 | 来源命令 | 输出位置 | 用途 |
| --- | --- | --- | --- |
| 框架整包 `ywxapp-<ver>.zip` | `package_framework.php` | `build/framework/` | 框架升级(整站覆盖) |
| 框架补丁 `ywxapp-<ver>-patch.zip` | `package_framework.php` | `build/framework/` | 框架增量升级(`from_version` 起 git diff |
| 完整安装包 `ywxapp-<ver>-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/<name>/info.php``version` | 不进包(随插件本身) | `addon/<name>/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-<version>.zip` —— 整包(整站,**不含插件**)
- `ywxapp-<version>-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/<name>/` 为 zip 根,`public/static/addon/<name>/``static/` 前缀。
并生成 `wxapp_appmarket_addon_list` 测试记录 SQL(用于往中心站插一条数据,便于联调)。
**产物**
- `build/addon/<addon>-<version>.zip`
- `build/sql/<addon>-<version>-appmarket_addon_list.sql`(测试记录,`file_path` 为本地绝对路径,中心站部署时需改成实际路径或走后台上传)
### 用法(支持自动递增版本号)
```bash
# 不带版本号:自动按 patch +1(读 addon/<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/<name>-<version>.zip` + `build/sql/<name>-<version>-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-<ver>.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 警告?**
Agit `autocrlf` 噪声,非错误,可忽略。