如何在项目不含bin目录的场景下创建Debian软件包
deb包不依赖bin目录的打包方案
完全可以实现,不存在deb打包规范强制要求bin目录的规则。
你之前遇到的必须有bin目录的限制,本质是之前使用的自定义打包脚本硬编码了project/bin作为待打包文件的检索路径,不是dpkg-deb工具本身的要求。dpkg-deb原生逻辑会自动遍历你指定的构建根目录下,除DEBIAN控制目录之外的所有文件、子目录,按照原有结构打包,安装时直接对应释放到目标系统的根路径下,根本不关心目录叫什么名字。
无路径调整的打包操作步骤
因为你没法调整现有文件的存放位置,直接按下面的流程走就行,不需要挪动现有业务文件:
- 准备临时构建目录,避免污染源文件目录
直接在项目根目录执行下面的命令创建临时构建空间,不需要改动原有文件位置:# 创建构建根目录和DEBIAN控制目录 mkdir -p ./.tmp_build/DEBIAN # 复制你现有的control等打包控制文件到构建目录 cp -r ./DEBIAN/* ./.tmp_build/DEBIAN/ # 给控制脚本加可执行权限(如果有postinst/prerm这类脚本的话) chmod 755 ./.tmp_build/DEBIAN/* - 替换原来硬编码找bin目录的复制逻辑,直接遍历所有项目文件
不要用原来写死复制bin目录的命令,直接遍历项目根目录下所有非DEBIAN、非临时构建目录的内容,全部复制到构建根下:# 开启隐藏文件匹配,避免漏掉点开头的配置文件 shopt -s dotglob for item in ./*; do item_name=$(basename "$item") if [ "$item_name" != "DEBIAN" ] && [ "$item_name" != ".tmp_build" ]; then cp -r "$item" ./.tmp_build/ fi done shopt -u dotglob - 执行打包命令
用fakeroot模拟root权限执行打包,避免文件权限不对的问题,dpkg-deb会自动遍历所有文件完成打包:fakeroot dpkg-deb --build ./.tmp_build ./your-app_1.0_amd64.deb # 打包完成后删除临时目录 rm -rf ./.tmp_build
注意事项
- 构建根下的文件路径要和你期望安装到目标系统的路径完全对应:比如你想把可执行文件装到
/usr/bin/下,就要在构建根下创建usr/bin目录再把文件放进去;如果直接把文件丢在构建根下,安装时会直接释放到系统根目录/下,很容易把文件放错位置。 - 不要用网上流传的固定模板打包脚本,这类脚本大多写死了bin、usr等目录路径,直接改脚本里的复制逻辑就行,不用迁就脚本调整你的项目结构。
只要你把DEBIAN控制目录放在构建根的一级子目录位置,剩下的目录结构可以完全按照你的需求自定义,没有强制命名要求。
内容的提问来源于stack exchange,提问作者a learner
相关产品推荐
相关产品推荐

