核心概念
选择模式
| 需求 | Plain | Managed |
|---|---|---|
| 为软件包目录生成索引 | sow create DIR |
用 sow add 导入软件包 |
| 保存配置与成员关系 | 目录内容就是状态 | sow.yml 与私有 SQLite 数据库 |
| 组织软件包 | 一个平面目录,可同时包含 RPM 与 DEB | 具名 Dist,每个 Dist 一种格式 |
| 生成架构视图 | 不支持 | 支持 |
| 过滤软件包、限制版本数 | sow prune DIR(RPM 按 NAME + ARCH 保留最新版)与 --pigsty 清理 |
每个 Dist 单独配置 |
| 签名 RPM 软件包 | 支持 | 支持 |
| 签名仓库元数据 | 在 SOW 外单独签名 | 在 sow.yml 配置密钥 |
| 记录构建快照与发布状态 | 在 SOW 外管理 | 内置 |
如果目录已包含全部待发布软件包,使用 Plain。如果需要由 SOW 持续管理成员与仓库,使用 Managed。
工作区、仓库与 Dist
Workspace/srv/sow
- sow.yml配置
- .sow/私有状态
Repository//srv/sow/local
- pool/软件包文件
dists/
Dist/具名 RPM 或 DEB 软件包集合
- views/各架构的元数据
工作区(Workspace) 保存一个或多个仓库的配置与私有状态。
仓库(Repository) 拥有自己的包池、Dist、构建历史与发布目标。对外提供完整的 pool/ 与 dists/ 目录树;把 sow.yml 和 .sow/ 留在 HTTP 文档根目录之外。
Dist 选择一种格式的软件包。例如,el9 放 RPM,bookworm 放 DEB。名称由你指定;SOW 不会检查软件包是否兼容名称所指的操作系统。
架构视图 保存某个架构的元数据。SOW 把 RPM noarch 与 DEB all 包加入每个适用的视图。
每个软件包只存一份
SOW 用完整包文件的 SHA-256 标识 包对象(Package Object),从包内元数据读取包名、版本与架构。
同一个仓库内,每个接受的软件包在 pool/ 下只有一条路径。多个 Dist 可以引用这条路径。不同仓库使用各自的包池。
RPM 元数据通过相对路径引用包池,APT Packages 使用相对于仓库根目录的路径。对外服务或复制时,保留完整仓库目录树。
部分镜像工具(包括默认 dnf reposync)拒绝 RPM 中指向父目录的路径。为这些工具使用 sow export rpm-leaf 导出独立 RPM 仓库。
期望成员与构建快照
期望成员(Desired membership) 是每个 Dist 选中的软件包集合。 Generation(构建快照) 标识一次已完成的构建及其文件清单。Built Generation 指当前已完成的构建。 包文件保存在共享包池中,每次构建无需另存一份。
add 和 rm 默认在更新成员后构建受影响的 Dist。使用 --skip 时只更新成员。完成一批跳过构建的变更后,或修改构建、签名配置后,执行 sow build。
| 命令 | 用途 |
|---|---|
sow status |
读取当前状态与 ready_to_copy 值 |
sow check |
检查软件包、索引、签名与状态记录,不修改文件 |
sow changes [BASE_GENERATION] |
列出指定快照到当前构建的文件变更 |
sow publish TARGET |
检查当前构建并发布到已配置目标 |
理解仓库状态
| 状态 | 含义 | 下一步 |
|---|---|---|
clean |
成员与配置符合已构建结果 | 可以检查或发布 |
dirty |
成员或配置变更需要构建 | 执行 build,再执行 check |
recovering |
被中断的操作需要恢复 | 按报错与恢复步骤处理 |
error |
状态记录或文件发生冲突 | 查看报错与操作日志 |
使用 sow log 查看失败或中断的操作记录。