Skip to main content

双包模式规范

双包模式下,原应用安装包(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-TarGz
  • package 必须与数据包 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,不可写为 amd64arm64。配置文件与架构无关。自动驳回
源包独立性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>` 不同)