发版与后期维护
你自己发一个新版本、客户站怎么拿到;升级时到底动了什么;出问题怎么退回去。
两条发布路线,先分清你是哪一边
- 发证方(产品的作者):你改的是程序本身,要把它发布出去,让别人的站能升级。
- 站长(用这套程序建站的人):你改的是内容与模板,需要把代码升级到新版本。
下面按这两条线分别讲。两边的界面是分开的:发证方在 「发行·发证方」分区,站长在「系统 → 在线更新」。
发证方:发布一个新版本
- 先改代码,本地能跑通。不要直接改服务器上的文件 —— 那样下一次有人升级,改动会被更新包覆盖掉。
- 进「版本管理」发布:填版本号、更新说明、上传代码包。 发布是不可撤回的:发布出去之后所有站点的更新列表里都会出现它。
- 更新说明要写给站长看:这一版改了什么、有没有需要他做的事 (比如要重新配置某个开关)。站长是靠这段文字决定要不要升的。
新表、新列一律写在
core/Migrate.php 里,不要写在 install.php 里。
install.php 只在安装那一刻跑一次,而已装好的站点根本走不到那里 ——
写在那儿的新列永远不会被创建,而你的开发机上一切正常(因为你重装过)。
Migrate.php 的编号步骤会被在线更新在文件替换之后自动执行一次。
升级时到底发生了什么
站长的「在线更新」按这个顺序走,中途任何一步失败都会停下并报出来:
- 校验安装包(签名与哈希),不通过直接拒绝。
- 先整站备份到
storage/backup/,改动过的文件也留一份。 - 替换文件。少数几个「内核闸门」文件是原子替换的, 不存在"换了一半"的中间状态 —— 那正是会让站点当场停摆的状态。
- 清理模板与页面缓存。
- 跑数据库迁移(
Migrate.php)。 ⚠️ 这一步必须在文件替换之后:跑在替换之前的话,用的还是旧代码的步骤表, 等于新版本的迁移从未执行。 - 同步开发手册章节(见下一节)。这一步失败不算更新失败 —— 文件都已经换好了,把它报成失败只会让人以为站点停在半路。
开发手册章节怎么送到客户站
手册的事实来源是程序目录里的 docs/docs_seed.php,
它在安装那一刻被播种进数据库。所以你在新版里加了章节之后,
客户站要拿到它,只有两条路:
- 在线更新(推荐):更新流程的最后一步会自动同步,站长什么都不用做。
- 命令行补一次:
只同步手册,别的一律不碰 —— 不动表结构、不重播示例数据、不重置任何开关。 重复执行是安全的(幂等):已经存在的篇目只在正文变化时才更新。cd 站点根/wwwroot php install.php --cli --seed-docs
同步的规则是按 slug 对齐:缺的插入、正文变了的更新、一样的跳过。 ⚠️ 这意味着手工在数据库里改过的正文会被下一次同步覆盖回来, 因为种子文件是唯一事实来源。要长期保住的改动,应该改种子文件本身。
手册在演示站里是关闭的:演示站是给客户看的样板,里面出现开发文档只会让人困惑。
前台
/docs 会直接返回 404。客户自己装的站不带这个限制 ——
手册本来就是随产品一起交付的。
出问题怎么退回去
- 文件:每次更新前的整站备份在
storage/backup/,按时间命名, 可以直接解包覆盖回去。 - 数据库:迁移只做「加表加列」,不删列也不删表, 所以退回旧版代码不会因为"少了列"而报错;新加的表留在库里不碍事。
- ⚠️ 覆盖回去之后要清一次缓存,否则页面还是旧的。
几个必须避开的坑
| 坑 | 说明 |
|---|---|
| 种子文件写错位置不报错 | docs_seed.php 里某一篇要是插到了分组的收尾括号之后,文件语法完全正常、也能搜到,但它落在组外面 → 播种器会静默跳过(grep 有、库里没有、还不报错)。加完章节后用 php install.php --cli --seed-docs 跑一次并数篇数,别只看文件 |
| 改服务器上的文件 | 下次更新会被覆盖。要改就改本地工程再发版;只改模板/内容则用子主题与后台,那些是被隔离保护的 |
| 新列写在 install.php | 已装好的站点永远拿不到(见上面的方块说明) |
| 升级前不备份 | 「在线更新」自己会备份,但你自己动手改库改文件前不会有人替你备份 |
| 迁移步骤编号不连续 | 迁移按顺序执行并记录到哪一步了,跳号会让后面所有步骤都不执行 |
