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

8.5 KiB
Raw Blame History

打包与发布指南

本仓库提供三套打包脚本,分别用于主框架整站升级包单个插件市场包批量插件市场包。 三者均已支持自动递增版本号,并配套「框架在线升级的数据库变更」机制。

部署(中心站 / 客户端如何对接)不在本文范围,参见 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.phpversion 不进包(随插件本身) addon/appmall/info.php
其他插件包 addon/<name>/info.phpversion 不进包(随插件本身) 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/.gitpublic/uploadsconfig/database.phpconfig/ywxapp.php.envinstall.lockaddon/(插件独立分发)。

用法(支持自动递增版本号)

# 不带版本号:自动按 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.sqlroot/upgrade.sql)。
  • 按语句拆分(忽略 -- 行注释与 /* */ 块注释),用 Db::connect()->execute() 执行。
  • 幂等:已执行版本记入 runtime/framework/sql_applied.json版本:文件名 为键),重复升级不重复执行;执行成功后会删除该 upgrade.sql
  • 执行失败抛 数据库升级失败:... 异常,由升级流程提示(文件已提前备份)。
  • ⚠️ 无事务回滚SQL 须写成幂等(如 CREATE TABLE IF NOT EXISTSADD 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 为本地绝对路径,中心站部署时需改成实际路径或走后台上传)

用法(支持自动递增版本号)

# 不带版本号:自动按 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.zmajor|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(每个插件一份)。

用法

# 不带 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. 典型发版流程

# 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 噪声,非错误,可忽略。