最近的一个ubuntu下的项目需要提交测试验收了,于是需要我们将程序打包。
打包的本质是将原始文件压缩与相应的控制命令绑定,最后进行软件安装的时候是将对应文件解压到指定目录,根据我们提供的控制逻辑来进行安装操作。
原来在windows下打包 我选择采用了 advancedInstaller ,而这次我使用了系统自带的dpkg
#环境准备
- ubuntu 14.04
- 可执行程序
- 所有的静态链接库
#安装必须工具
apt-get install dh-make
#准备安装文件夹
可以在任意位置下进行,创建如下结构的目录
- 文件根/ - DEBIAN/ control .... - opt/ - filename/ 可执行文件 静态链接库
对于最后的安装过程来说 文件根将对应成系统根目录,如果我们需要添加对应文件到系统指定位置 只要在文件根对应文件层次上放上指定文件就可以了
比如我们要在 /usr/local/lib 下添加 libtest.a
那么最后的组织就会变成
- 文件根/ - DEBIAN/ control .... - opt/ - filename/ 可执行文件 静态链接库 - usr -local/ -lib/ libtest.a
DEBIAN文件夹下存放的是相应的控制逻辑,control文件是必须的。
control文件下配置程序的元信息
内容大致如下
Package: #包名 Version: #版本号 Section: gnome Priority: extra #优先级 Maintainer: name<mailaddress> #维护者 Homepage: http://... #主页地址 Architecture: amd64 #这里添加 i386 amd64等参数 Depends:<span style="white-space:pre"> </span>#如果存在依赖的库在这里填写 Description: #描述信息
相关手册上的描述 请参考https://www.debian.org/doc/debian-policy/ch-controlfields.html
Package (mandatory) Source Version (mandatory) Section (recommended) Priority (recommended) Architecture (mandatory) Essential Depends et al Installed-Size Maintainer (mandatory) Description (mandatory) Homepage Built-Using
在DEBIAN 目录下可以创建一些特定文件保存在特定时间点执行命令
比如
prerm #需要在删除前执行的命令
postrm #需要在删除前执行的命令
其他的我没有用到 需要的可以自行搜索 或者试着在https://www.debian.org/doc/debian-policy/ 上面找一下
#打包
dpkg -b 文件根路径 目标路径(以deb结尾)
e.g
dpkg -b build/ test.deb
##可能遇到问题
子文件权限不够
解决方案:将对应文件的权限修改为775
#尝试安装
sudo dpkg -i test.deb
#删除包
sudo dpkg -r test #这个test 是你之前配置的包名
##可能遇到问题
卸载不完全,提示warning
分析: 在文件安装路径下存在了一些程序运行时生成的文件,
解决方案:配置 prerm文件 在卸载之前将对应文件先删掉就可以了
卸载了一些不该卸载的东西
分析:在卸载的时候 dpkg是会将安装的所有文件都删除的,所以如果你程序中存在着一些与其他程序共享的部分,那么卸载的时候共享的部分也还是会被删除的,
解决方案:尽可能打包成一个独立的组件,不要将静态库放入系统共享空间中去。