pkgr进阶玩法:用5个自定义Hook脚本完全掌控安装与构建流程

📅 发布时间:2026/8/22 13:35:15
pkgr进阶玩法:用5个自定义Hook脚本完全掌控安装与构建流程 pkgr进阶玩法用5个自定义Hook脚本完全掌控安装与构建流程【免费下载链接】pkgrPackage any app into deb or rpm packages, using heroku buildpacks项目地址: https://gitcode.com/gh_mirrors/pk/pkgrpkgr 是一个开源打包工具能把任意应用Python、Ruby、Node.js、Go 等借助 Heroku 风格的 buildpack 一键打包成 deb 或 rpm 安装包。而它最强大的进阶能力就是5 个自定义 Hook 脚本——你可以在打包的每个关键时刻插入自己的逻辑编译前后、安装前后、卸载前后。读完本文你将完全掌控整个软件交付流程 Hook 是什么先看懂 pkgr 的两个执行阶段pkgr 的完整生命周期分为两个阶段Hook 脚本贯穿其中阶段运行位置可用 Hook构建阶段打包时构建机before、after运行时安装/卸载时目标机器before_install、after_install、before_remove、after_remove其中安装与卸载阶段的 4 个 Hook会被 pkgr 内置在四个系统维护脚本模板中随 deb/rpm 包一起分发到用户机器上安装前data/hooks/preinstall.sh安装后data/hooks/postinstall.sh卸载前data/hooks/preuninstall.sh卸载后data/hooks/postuninstall.sh这些模板会自动创建应用专用用户、链接日志目录到/var/log/应用名、设置/etc/应用名配置目录权限等基础工作。你只需在pkgr.yml里声明脚本路径pkgr 就会把你的脚本以 base64 编码嵌入模板在正确时机执行——无需自己维护任何维护脚本。Hook 1before —— 编译前预处理构建机在 buildpack 开始编译之前执行适合做依赖准备、版本锁定等预处理。在pkgr.yml中声明before_precompile: ./packaging/setup.sh参考示例见 spec/fixtures/pkgr.yml。它的触发逻辑位于 lib/pkgr/builder.rb构建机找到匹配的 buildpack 后先运行before钩子再依次执行compile与release。典型场景构建前切换依赖源、安装仅构建机才需要的临时工具。Hook 2after —— 编译后收尾构建产物buildpack 全部编译完成后立即执行是对构建产物做最后加工的黄金时机after_precompile: ./packaging/patch.sh典型场景拷贝额外的静态资源、注入构建时间戳、生成版本说明文件、清理缓存目录。这两个钩子的实现细节可以在 lib/pkgr/config.rb 中查看before/after列表式写法会被自动拼成一个临时脚本执行。Hook 3before_install —— 用户机器上的安装前钩子这是目标机器上、包文件解包之前执行的脚本。pkgr 内置的 preinstall 模板会先帮你创建应用用户和组然后才调用你的自定义脚本见 data/hooks/preinstall.sh。⚠️重要限制此时包尚未解包脚本不能依赖包内任何文件只能使用系统自带命令。典型场景迁移旧版本数据、停掉正在运行的旧服务、初始化数据库目录。Hook 4after_install —— 安装后初始化最实用的钩子包解包完成后执行是四个安装钩子中能力最强的一个调用点见 data/hooks/postinstall.sh。模板执行前会注入 4 个环境变量你的脚本可以直接使用环境变量含义示例值APP_NAME应用名称my-appAPP_USER运行用户my-appAPP_GROUP用户组my-appAPP_HOME安装目录/opt/my-app典型场景运行数据库迁移bin/rails db:migrate、生成默认配置文件并提示用户运行sudo my-app configure、设置服务开机自启。Hook 5before_remove / after_remove —— 优雅的卸载清理删除软件时包管理器只会移除包内文件无法清理运行期产生的数据。这正是卸载钩子的用武之地before_remove文件还在时执行调用逻辑见 data/hooks/preuninstall.sh适合停服务、备份日志after_remove文件已删除后执行适合清理用户数据目录、删除应用用户两者在 lib/pkgr/config.rb 中定义在pkgr.yml中同样一行声明即可before_remove: ./packaging/stop.sh after_remove: ./packaging/cleanup.sh让卸载和安装一样优雅用户才不会骂街 最佳实践写好 Hook 脚本的 4 条军规务必加set -e任何一步失败立即中止避免留下半安装状态只做幂等操作用mkdir -p、[ -f ... ] || ...等写法保证重复安装不出错充分利用环境变量APP_NAME/APP_USER/APP_HOME让你无需硬编码任何路径输出友好提示安装后告诉用户下一步该做什么如运行configure命令pkgr 模板本身就有这个设计见 data/hooks/postinstall.sh总结一张表看懂 5 个 HookHook运行位置时机一句话定位before构建机buildpack 编译前预处理构建环境after构建机编译完成后加工构建产物before_install目标机包解包前安装前置准备after_install目标机解包完成后初始化与配置before_remove/after_remove目标机卸载前后优雅清理拿到 pkgrgit clone https://gitcode.com/gh_mirrors/pk/pkgr后只需在pkgr.yml中声明这 5 个脚本路径你写的应用包就会拥有专业发行级软件的全部生命周期管理能力。从构建到卸载每个环节都在你的掌控之中 ✅【免费下载链接】pkgrPackage any app into deb or rpm packages, using heroku buildpacks项目地址: https://gitcode.com/gh_mirrors/pk/pkgr创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考