开发者 1 更新于 2026-10-13

安装包规范与打包

上传到应用市场的模板包与源码(插件)包,都会在报名表提交前先经 Core\PackageValidator 规范检测。本文把检测项、必填文件、打包方式与 常见驳回原因一次讲清——照着本文打包,可以一次通过。

一、检测结果的三档

检测返回四类信息:

档位字段是否阻断说明
错误errors是存在任一项即不允许上传 / 不通过
建议warnings否仅提示,不阻断,但建议补齐
元信息info—从包内描述文件解析出的 name/title/version/author
文件数files—包内有效文件数量(已过滤 macOS 元数据)

后台「规范检测」与前台发布表单共用同一套校验,口径完全一致。

二、通用检测(两类包都做)

  1. 不是有效 zip → 报错。文件不存在、损坏、或服务器未启用 zip 扩展都会拦截。
  1. 压缩包为空 → 报错。
  1. 目录穿越 / 绝对路径 → 报错。包内出现 ../、以 / 开头、

或以盘符(如 C:)开头的条目,一律拒绝。

  1. 公共顶层目录自动去除 —— 如果包内所有文件都在同一个顶层目录下

(例如 my-theme/…),校验时会剥掉这层前缀,使包根规范化。 两种打包方式都接受:直接压内容,或压一层文件夹。

  1. 危险函数扫描 —— 对包内 .php/.inc/.phtml 文件扫描

eval / assert / system / exec / shell_exec / passthru / popen / proc_open, 命中会写入 warnings(提示确认安全,不阻断)。

  1. 介绍文件检测 —— 包内需有 README.md / README.txt / README

或 docs/ 目录下的说明文件,否则给出「建议补充介绍文件」的建议项。

  1. macOS 元数据自动忽略 —— __MACOSX/ 与 .DS_Store 会被跳过,不影响检测。

三、模板包(type = template)

必需(errors)

文件 / 字段说明
theme.json位于包根,必须是合法 JSON
theme.json.name必填,非空
theme.json.title必填,非空
theme.json.version必填,非空
首页模板index/index.html,或 index/index.htm,或根级 index.html

建议(warnings,不阻断)

  • list/index.html、detail/index.html、common/header.html
  • static/ 静态资源目录(无静态文件可忽略)
  • 包内介绍文件(README / docs)

theme.json 示例:

{
  "name": "mytheme",
  "title": "我的主题",
  "version": "1.0.0",
  "author": "你的名字",
  "description": "一句话介绍",
  "screenshot": "screenshot.png"
}

模板目录结构与模板分层详见 模板开发 · 入门,主题配置字段 详见 模板开发 · 主题配置。

四、源码 / 插件包(type = source)

必需(errors)

文件 / 字段说明
info.ini位于包根,key = value 键值对形式
info.ini.name必填;必须匹配 ^[a-z][a-z0-9_\-]{1,29}$
info.ini.title必填,非空
info.ini.version必填,非空
入口类文件{Studly(name)}.php,位于包根

name 规则要特别注意:**小写字母开头,只能含小写字母、数字、下划线、连字符, 长度 2–30**。例如 my_plugin、seo-boost 合法,MyPlugin、2fa 不合法。 入口类名由 name 转成大驼峰:my_plugin → MyPlugin.php。 若找不到规范入口类,会回退使用包根第一个 .php 并给出建议(不阻断); 若包根一个 .php 都没有,则报错。

建议(warnings,不阻断)

  • config.php(后台配置项定义)
  • 包内介绍文件(README / docs)

info.ini 示例:

name = my_plugin
title = 我的插件
intro = 一句话介绍这个插件能做什么
author = 你的名字
version = 1.0.0
require = 1.0.0

插件目录结构与生命周期详见 插件开发 · 目录结构 与 插件开发 · 生命周期与钩子。

五、打包步骤

以插件为例(模板同理,换成模板目录):

cd addons/my_plugin
zip -r ../../../my_plugin-1.0.0.zip . \
    -x "*.git*" "*.DS_Store" "*__MACOSX*" "*.idea*"

要点:

  • zip 产物放在被压目录外面,否则会把自己再打进去,形成递归。
  • 不要包含 .git、pycache、编辑器临时文件、.DS_Store。
  • Windows 下用「发送到 → 压缩(zipped)文件夹」时,选中目录内的内容

再压缩,或直接压缩整个目录(公共顶层目录会被自动剥离)。

  • 打包后建议本地先解压检查一次,确认 theme.json / info.ini 位于包根。

六、常见驳回原因速查

现象原因处理
提示「缺少模板描述文件 theme.json」描述文件不在包根,或被打进子目录且未形成公共前缀把 theme.json 放到包根
提示「theme.json 不是合法的 JSON」有尾随逗号 / 注释 / BOM用 JSON 校验器修正
提示「缺少首页模板」没有 index/index.html补首页模板
提示「info.ini 的 name 需以小写字母开头…」用了大写或含非法字符改成 my_plugin 这类
提示「缺少插件入口类文件 Xxx.php」类名与 name 不匹配让文件名 = 大驼峰(name)
提示包内存在非法路径压缩时带了绝对路径在包根目录下重新打包
提示介绍文件缺失(建议)没有 README / docs补一份 README.md
提示可疑函数调用(建议)出现 eval/exec 等确认安全或改用安全写法

下一页