一次构建,多平台发行:用pkgr的pkgr.yml配置文件打包30+个Linux发行版 📅 2026/8/22 14:53:55 一次构建多平台发行用pkgr的pkgr.yml配置文件打包30个Linux发行版【免费下载链接】pkgrPackage any app into deb or rpm packages, using heroku buildpacks项目地址: https://gitcode.com/gh_mirrors/pk/pkgrpkgr是一款开源的 Linux 应用打包工具它基于 Heroku 构建包buildpacks能把你的任意应用一键打成deb / rpm 安装包并自动附带启动脚本、cron、logrotate 等系统配置。只需在应用仓库中放一份.pkgr.yml配置文件你就能让同一份代码适配Ubuntu、Debian、CentOS、SLES、Amazon Linux等 30 多个发行版——真正做到「一次构建多平台发行」。为什么用 pkgr 打包 Linux 应用传统方式分发应用用户需要手动装依赖、配环境、写服务脚本繁琐且易错。pkgr 的思路是复用 Heroku 构建生态官方支持 Ruby、NodeJS、Python、Go通过 buildpack 把语言运行时和依赖直接打进包内一份配置全平台覆盖pkgr.yml 里用targets块为不同发行版定制依赖其余共用开箱即用的系统能力自动生成 systemd / upstart / sysvinit 启动脚本应用安装在/opt/应用名日志写入/var/log/应用名/并自动配置 logrotate。打包完成后用户只需一条apt install或yum install命令还能用service 应用名 start|stop|restart管理服务。第一步安装 pkgr 并执行打包pkgr 提供 Docker 镜像和 Ruby gem 两种安装方式。使用 Docker 时可以在任意宿主机上为目标发行版构建包# 安装 Ruby gem gem install pkgr # 或在任意宿主机上用 Docker 构建 docker run --rm -it -v $(pwd):/app -v /tmp/cache:/cache pkgr/ubuntu:20.04然后对应用仓库执行打包命令生成的.deb或.rpm会出现在当前目录pkgr package path/to/app/repo 前提是应用中有Procfile并且主配置可以通过环境变量注入即 Heroku 兼容。核心编写 pkgr.yml 配置文件.pkgr.yml是 pkgr 的大脑放在应用仓库根目录即可。下面是一份典型的完整示例项目测试夹具 spec/fixtures/pkgr.yml 中也有类似结构可以参考name: some-awesome-app description: An awesome description here! homepage: http://example.org user: git group: git before_precompile: ./packaging/debian/setup.sh targets: debian-6: squeeze build_dependencies: - libmagickcore-dev - libmagickwand-dev dependencies: - mysql-server - git-core ubuntu-10.04: *squeeze ubuntu-12.04: *squeeze centos-6: true fedora-20: false debian-7: dependencies: - git-core全局字段一览字段作用name/description/homepage包的基本信息显示在包管理器中user/group运行应用的用户和组默认取应用名before_precompile构建前执行的脚本适合安装编译期依赖targets按发行版定制依赖与开关多平台发行的关键用 targets 块实现多平台发行targets的每个键就是一个发行版标识如debian-7、ubuntu-12.04、centos-6值有三种写法true—— 启用该发行版使用默认依赖无需额外配置false—— 显式跳过该发行版构建时会直接报「目标未定义」之外的跳过处理YAML 映射—— 为该发行版定制dependencies运行期依赖和build_dependencies构建期依赖。示例中squeeze/*squeeze是 YAML 锚点与引用技巧Debian 和老版本 Ubuntu 依赖相近定义一次、引用多次即可配置瞬间瘦身。解析逻辑位于lib/pkgr/config.rb构建时 pkgr 会读取当前目标发行版若targets中未声明该目标会直接抛出清晰的错误并列出所有可用目标帮你快速定位拼写问题。依赖从哪来内置的发行版依赖清单除了你在 pkgr.yml 中声明的依赖pkgr 还会自动叠加一套内置的默认依赖按发行版分组存放在data/dependencies/目录如debian.yml、centos.yml、ubuntu.yml。以data/dependencies/debian.yml为例它按版本区分 libssl、libevent、libreadline 等库的版本号——不同发行版的系统库版本差异正是打包最头疼的部分pkgr 已替你处理好了。构建期依赖同样有内置清单见data/build_dependencies/目录而各发行版默认使用的 buildpack 列表则维护在data/buildpacks/下如ubuntu-24.04、centos-9等 30 余个文件涵盖 Ruby、Python、NodeJS、Go 构建包。你也可以用--buildpack或--buildpack-list参数对应配置文件中的buildpack/buildpack_list字段指定自定义构建包。一次构建30 平台如何跑起来整个「多平台发行」流程非常直观声明目标在.pkgr.yml的targets中列出你要支持的所有发行版逐平台构建在对应发行版环境或对应 Docker 镜像中执行pkgr package .pkgr 自动读取当前发行版、合并该目标的专属依赖自动适配启动脚本按发行版自动选择 systemd新系统、upstart 或 sysvinit 模板模板源码在data/init/下环境文件由data/environment/default.erb生成产出安装包得到当前平台对应的.deb或.rpm。配合 CI为每个targets条目跑一次打包任务即可一次性产出覆盖 30 多个发行版的完整包矩阵——这正是 GitLab、Discourse 等开源项目选择 pkgr 的原因。常见问题速查报错Target xxx is not defined in .pkgr.yml你构建的发行版没写进targets把键名补齐即可找不到pkgr命令老版 Debian将/var/lib/gems/1.9.1/bin追加到PATH安装时报 invalid byte sequence先执行locale-gen en_US.UTF-8并设置LANG/LC_ALL后重试找不到 init 脚本脚本在首次执行sudo 应用名 scale web1后才生成。总结pkgr 把「跨发行版打包」这件复杂的事压缩成了一份 YAML 文件全局字段定义包的元信息targets块按发行版定制依赖YAML 锚点进一步消除重复。无论是内部工具交付还是开源项目发行一份.pkgr.yml就能让你的应用以原生 deb/rpm 包的形式抵达 30 多个 Linux 平台——一次构建多平台发行用户的安装体验也从「半小时折腾」变成「一条命令」。【免费下载链接】pkgrPackage any app into deb or rpm packages, using heroku buildpacks项目地址: https://gitcode.com/gh_mirrors/pk/pkgr创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考