我的之前的一篇博客尝试了从源码制作安装包.deb
文件,通过checkinstall命令从源码编译打包了PCL库。然后我想如果我需要更改这个包的一些信息怎么办,比如这个包需要其他一些依赖项而我之前打包的时候忘了添加这个依赖项。我查了checkinstall的手册和一些博客,但貌似checkinstall并不提供更改deb包的功能(也有可能是我没有发现)。然后我发现可以使用dpkg
命令进行deb包的信息查看、更改等,dpkg
这个命令可以说非常强大了,具体的请man dpkg
,这里只介绍我用到的功能。
查看deb包信息
使用dpkg-deb相关命令可以查看deb包的相关信息:
dpkg-deb -c
:列出包所含的内容dpkg-deb -W
:打印安装包的简明信息dpkg-deb -I
:打印控制信息
修改deb包信息
- 解压deb包内容与控制信息
mkdir extract
,在当前目录下新建文件夹,用于存放解压后的内容mkdir extract/DEBIAN
,新建DEBIAN目录用于存放包的控制信息dpkg -X ./opencv_4.2.0_amd64.deb extract/
,将要修改的deb包解压到extract目录下,可以看到:
类似这样的目录结构(这里只列出了三层目录结构)。我猜想安装软件包其实就是按照这个目录结构将相关的共享库文件、头文件以及文档之类的复制到根目录下对应目录层次下。dpkg-deb -e ./opencv_4.2.0_amd64.deb extract/DEBIAN/
,将deb包的控制信息提取到DEBIAN目录下,然后更改该目录下的控制信息即可。该目录下会有一个conffiles和一个control,control内容与dpkg-deb -I opencv_4.2.0_amd64.deb
打印出来的内容相似:
该文件指定该软件包的包名、版本、依赖等信息。
- 修改相关文件
想要更改包的依赖项直接在control中改就可以,比如我上面打包opencv时Depends缺了个jasper,jasper-dev,然后我在这里添上。实际上DEBIAN目录下保存包的控制信息,不仅可以修改这个control中有的信息,还有设置安装之前执行的脚本,安装之后执行的脚本以及卸载前后执行的脚本,比如在DEBIAN目录下新建:- preinst文件:指定安装之前执行的脚本命令,一般为正在被升级的包停止相关服务,直到升级或安装完成,参考。这里因为jasper与libjasper-dev安装时需要添加一个安装源,我的preinst脚本如下——
#!/bin/bash if cat /etc/apt/sources.list |grep '^deb http://security.ubuntu.com/ubuntu xenial-security main$';then echo 'the source already added in /etc/apt/source.list file'; else sudo add-apt-repository "deb http://security.ubuntu.com/ubuntu xenial-security main" sudo apt update fi
- postinst文件:在deb包安装完毕后执行一些配置工作等。这里我没有创建
- prerm文件:卸载钱执行的脚本
- postrm文件:卸载后执行脚本
另外如果创建了脚本,需要更改其权限,给其添加执行权限sudo chmod a+x preinst
。
使用dpkg重新打包
完成了一上更改之后需要将其打包回一个deb文件,dpkg-deb -b ./extract opencv_4.2.0_amd64.deb
。
现在dpkg-deb -I opencv_4.2.0_amd64.deb
查看其更改后的信息: