Arch与Manjaro等Arch系发行版软件包命名规范问询
区分Arch/Manjaro包命名的可行方案
针对用makepkg打包自研软件,需要区分Arch和Manjaro版本且不破坏pacman兼容性的需求,有以下几种实用方法:
1. 修改pkgrel字段添加发行版标识
这是最符合pacman版本规范的方式,pkgrel允许包含字母、点号或加号等符号,不会影响包管理器识别。
- 动态设置
pkgrel:在PKGBUILD中加入发行版判断逻辑,自动适配:# 根据发行版设置pkgrel if grep -q "ID=manjaro" /etc/os-release; then pkgrel=1.manjaro else pkgrel=1 fi - 生成的包名示例:
- Arch版:
doas-keepenv-1.0-1-any.pkg.tar.zst - Manjaro版:
doas-keepenv-1.0-1.manjaro-any.pkg.tar.zst
- Arch版:
- 优势:pacman能正确识别版本优先级,后续升级时可正常处理版本对比。
2. 构建后重命名包文件
如果不想改动PKGBUILD的版本字段,可在makepkg完成后手动/脚本重命名,仅修改文件名不影响包内部的版本信息:
- 示例脚本:
# 构建包 makepkg -s # 识别当前发行版并重命名 if grep -q "ID=manjaro" /etc/os-release; then mv doas-keepenv-1.0-1-any.pkg.tar.zst doas-keepenv-1.0-1-manjaro-any.pkg.tar.zst else mv doas-keepenv-1.0-1-any.pkg.tar.zst doas-keepenv-1.0-1-arch-any.pkg.tar.zst fi - 注意:安装后pacman显示的版本仍为
1.0-1,但文件名可明确区分发行版,适合分发场景。
3. 自定义pkgbase(适合独立软件)
若软件无复杂依赖,可通过修改pkgbase添加发行版标识,直接改变包的基础名称:
- PKGBUILD配置示例:
if grep -q "ID=manjaro" /etc/os-release; then pkgbase=doas-keepenv-manjaro else pkgbase=doas-keepenv fi pkgname=("$pkgbase") - 生成的包名示例:
doas-keepenv-manjaro-1.0-1-any.pkg.tar.zst - 注意:此方式会改变包的名称,若软件有依赖关系需同步调整依赖配置,仅推荐无依赖的自研软件使用。
关键注意事项
- 不要修改
pkgver字段:pkgver对应软件本身的版本号,修改会混淆软件版本与发行版适配版本。 - 版本优先级:若针对Manjaro做了专属补丁,可将
pkgrel设为1.1.manjaro,确保Manjaro版本的优先级高于同软件版本的Arch版。 - 兼容性测试:打包后务必用
pacman -U <包文件>测试安装,确认无报错或兼容性问题。
内容的提问来源于stack exchange,提问作者Stas Badzi
相关产品推荐
相关产品推荐

