双包模式规范
双包模式下,原应用安装包(deb源包)保持不变,额外提供一个应用数据包(deb数据包)。deb数据包包含 TOS 7.0 所需的配置文件,两者打包为 tar.gz 压缩包提交。
数据包命名规则: <appid>.deb(建议与 config.ini.id 保持一致,全小写)
数据包内部文件结构:
<appid>.deb
├── DEBIAN/
│ ├── control
│ └── postinst
└── usr/
└── local/
└── <appid>/
├── config.ini
├── <appid>.lang
├── images/
│ └── icons/
│ └── <appid>.svg
├── webui.bz2 # WebUI 应用需要
└── nginx/ # 仅外部打开需要
└── <appid>.conf
数据包 DEBIAN/postinst:
#!/bin/bash
set -e
# 确保配置文件权限正确
chmod 644 /usr/local/<appid>/config.ini 2>/dev/null || true
chmod 644 /usr/local/<appid>/<appid>.lang 2>/dev/null || true
chmod 644 /usr/local/<appid>/images/icons/<appid>.svg 2>/dev/null || true
exit 0
数据包 config.ini 注意事项:
icon路径固定为/images/icons/<appid>.svg(与数据包图标文件名一致)id与 config.ini 中的id字段完全一致version与源包元数据的Version完全一致application_type必须填写deb-TarGzpackage必须与数据包 DEBIAN/control 中的Package字段一致
源包内部文件结构:
<package>.deb
├── DEBIAN/
│ ├── control
│ ├── preinst
│ ├── postinst
│ ├── prerm
│ └── postrm
└── usr/
└── local/
└── <appid>/
├── bin/
│ └── <binary_name>
├── depends/ # 如有依赖
│ ├── bin/
│ ├── lib/
│ └── ...
└── init.d/
└── <system_id>.service
提交压缩包结构:
<appid>_<platform>.tar.gz
├── <appid>.deb # deb数据包
└── <package>.deb # deb源包
GitHub 仓库数据结构(双包模式):
<appid>_<platform>.tar.gz
├── <appid>.deb # 应用数据包
└── <package>.deb # deb源包(原应用安装包)
双包模式强制约束:
| 约束 | 说明 | 违规后果 |
|---|---|---|
| 安装顺序 | 必须先安装源包(<package>.deb),再安装数据包(<appid>.deb)。数据包依赖源包。 | 安装失败 |
| 版本强一致 | 两个包的 Version 必须完全相同。任何版本不匹配将触发自动驳回。 | 自动驳回 |
| 数据包禁止二进制 | 数据包(<appid>.deb)严禁包含任何可执行二进制文件、编译代码或系统特定库。仅允许配置文件、图标、语言文件、nginx配置等静态资源。 | 在提交时自动校验阶段即会拦截,不进入人工审核。 |
| 数据包架构 | 数据包 Architecture 必须为 all,不可写为 amd64 或 arm64。配置文件与架构无关。 | 自动驳回 |
| 源包独立性 | deb源包必须可以独立在 TOS 7.0 系统上使用 dpkg -i 命令进行安装。 | 安装失败 |
| 依赖声明 | 数据包的 Depends 字段必须写上源包包名,建议和版本一起指定。 | 驳回 |
| Systemd 服务文件归属 | systemd 服务文件(.service)必须放在源包中,数据包不可包含。数据包仅负责 TOS 平台配置与展示。 | 驳回 |
| 卸载顺序 | 卸载时先卸载数据包,再卸载源包。数据包卸载不影响源包的运行数据。 | — |
安装与卸载流程:
# 安装顺序
sudo dpkg -i <package>.deb # 1. 先安装deb源包
sudo dpkg -i <appid>.deb # 2. 再安装deb数据包
# 卸载顺序
sudo dpkg --remove <appid> # 1. 先卸载数据包
sudo dpkg --purge <package> # 2. 再卸载源包(`<package>` 为源包在 DEBIAN/control 中声明的 `Package` 字段值,通常与数据包的 `<appid>` 不同)