包命名指南
构建服务教学 - 技巧和花样 - 跨发行版打包 - Debian 打包指南 - 打包检查
桌面菜单分类 - 打包常用的 RPM 宏 - 小脚本片段 - SysVinit 脚本 - 源代码服务
OBS 打包互助问答 - 打包黑名单
目录
包命名的通用字符集
由于 openSUSE 是个跨国社区,为了统一和使用便利,需要为包命名设定一个通用字符集。
所有的 openSUSE 包名只能使用如下 ASCII 字符:
abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789-._+
如果上游的命名含有不在指定字符集里的字符
openSUSE 也意识到转换文字到指定的 ASCII 字符集的任务 (aka transliteration) 是很困难的。相应的,如果上游的命名含有不在指定字符集里的字符时,openSUSE 包维护者应该先联系上游,把皮球踢给他们。
在且只在上游不能、不愿提供一个转换过的名字或干脆就没上游的情况下,openSUSE 打包者才可以决定是自行转换,还是拍拍屁股放弃打包。
如果决定了自己转换,openSUSE 打包者应该先看看是否有其他发行版已经搞定了包名,拿它们的过来改改。
转换后的包名应该 Provide(提供): 原始的未转换的包名,但这不是必须的。
通用命名
一般在命名时,名字应该反映上游的压缩包或者作为该软件起源的项目名。有时命名的选择可能复杂一点。如果以前其他发行版/打包者已经打包过它了,那你应该和他们的命名尽量保持一致。任何情况下,请审慎行事,其他打包者也可以帮你选个好名字。
有时,上游开发者的命名包含不在 通用字符集 里的字符。如果发生了这样的情况,参考:如果上游的命名含有不在指定字符集里的字符。
分隔符
为 openSUSE 命名包时,维护者必须使用连接线 '-' 作为名字的分隔符。一定不能使用下划线 '_',加号 '+',或者小数点 '.' 作为分隔符。
有些特例使用了下划线 '_' 作为命名的分隔符。
- httpd, pam, 和 SDL addon 辅助软件包,参考 " Addon 辅助软件包 (httpd, pam 和 SDL) "。
- 跟「区域和语言」相关的包,在名字的 locale 部分里使用了下划线,参考" Addon Packages (区域和语言) "。
- 上游的命名里本身带了下划线的也被排除在外。
例如:
java_cup libart_lgpl microcode_ctl nss_ldap sg3_utils
如果搞不清楚,请在 opensuse-packaging 邮件列表里提问。
同一个「基础名」的多个软件包
由于多种原因,有时候统一安装的多个软件包会采用不同的版本号。一旦准备这么做,包名应该反映这一事实。主包应该采用不带版本号的基础名,而所有其他的辅助子软件包应该在命名时带上版本号。也有一些例外是所有的包都带上版本号。
例子:
openSUSE 有时会提供多个版本的 autoconf 或者 sqlite 以便于向后兼容。
最新版本的 autoconf 命名为 Name: autoconf
旧的 2.1.3 版本的 autoconf 命名为 Name: autoconf213
3.x 系列的 sqlite 命名为 Name: sqlite3
和 Name: sqlite3-devel
2.x 系列的 sqlite 命名为 Name: sqlite2
和 Name: sqlite2-devel
请注意这种情况下名字里是不带分隔符的,我们附加的是不带小数点的版本号。
需要特殊处理的是共享函数库,由 共享函数库打包策略 详述。
大小写
为 openSUSE 打包时,维护者应该尽最大努力去妥善命名一个包。虽然我们不强制要求大小写,但请只在必要时才用。最好尊重上游开发者的命名。如果他们命名他们的软件为 "ORBit",那你最好也用 "ORBit" 做包名而不是 "orbit"。如果他们没有大小写的偏好,那你最好默认使用小写。
perl 模块的命名例外。CPAN 组和类型应该全部大写,如果组和类型构成英文单词,那么首字符大写。(具体参考 Addon 辅助软件包 (perl 模块) 。)
Spec 文件名
spec 文件应该用 %{name}.spec 格式命名。如果你的软件包叫 foo-1.0-1.src.rpm,那么 spec 文件就应该叫 foo.spec。
重命名/替换已有包名
有时确实有必要重命名/替换一个已有的包名,新包应该透明化这个修改,至少让最终用户能够知道这是对老包的重命名或替换。如果要重命名的软件包没有任何功能上的变化,或者可以作为已有旧包的提供了足够兼容性的替代品(「足够」意味着只有一般的类似包升级那样的包大小变化),应该通过以下方法提供清晰的追溯路径和兼容性
Provides: oldpackagename = %version Obsoletes: oldpackagename < 1.0
如果一个软件包覆盖/替代了一个已有包却没有提供上述的「足够兼容性」,那么请只使用 Obsoletes 标签。
例子
- walkman 重命名为 ipod
- ipod 和 walkman 兼容
- walkman 包最后的版本是 walkman-1.4
ipod.spec 里应该这么写
Provides: walkman = %{version} Obsoletes: walkman < 1.0
Provides(提供) 也是过时的和短期的,下下次发行版升级就会被移除。对于那些通常不使用包名作为升级依赖的软件包例如共享库包(是通过 soname 依赖升级的),通常也就没必要添加 Provides。
文档子包
庞大的文档文件应该被切分出一个子包,这个子包的命名格式是:%{name}-doc
。
「庞大」的定义取决于打包者的判断,不单纯取决于大小。「庞大」可以是大小也可以是数量。
Addon 辅助软件包 (通用)
如果一个新包被认为是对已有的一个软件包的内容扩展或功能增加的辅助软件包,单独不可用,那么它的名字也应该反应这一事实。
新包名 ("子软件包") 应该以 "母" 包的包名为前缀:%{母包名}-%{子包名}
.
例子:
gnome-applet-netmon (gnome 的 netmon 挂件, 依赖 gnome) php-adodb (php 的 adodb 函数, 依赖 php) python-twisted (python 的 twisted 模块, 依赖 python) xmms-cdread (xmms 的直接读 CD 功能, 依赖 xmms)