当前位置:网站首页>如何制作deb包
如何制作deb包
2022-07-30 20:25:00 【666QAQ】
原文链接:https://www.internalpointers.com/post/build-binary-deb-package-practical-guide
前言
deb文件是包含数据的存档,扩展名为.deb
。
用它来发布或安装Debian及其衍生版本的linux程序非常简单。
使用deb包可以很方便地处理依赖关系、加进你的电脑、安装卸载。
这个教程会教你如何从0开始制作deb包,并在目标系统中安装一个二进制可执行文件。
先来了解一些理论基础。
了解deb包的结构
deb包是标准的Unix归档程序包,包含你的应用程序和其他实用程序文件。最重要的是控制文件,它存储了deb包的信息和要安装的程序。
对内,deb包的文件夹模仿典型的linux系统结构,例如/usr
,/usr/bin
,/opt
等。在安装时,这些文件夹内的文件会被复制到真实文件系统的对应位置。
比如,一个<.deb>/usr/local/bin/binaryfile
会被安装到/usr/local/bin/binaryfile
。
对外,所有的deb包遵循相同的命名约定:<name>_<version>-<revision>_<architecture>.deb
其中:
- <name>
- 应用程序名
- <version>
- 应用程序版本号
- <revision>
- 当前deb包的版本号
- <architecture>
- 程序运行的硬件架构
比如,假设你要发布的程序叫做hello,版本为1.0,为构建64-ARM处理器构建。则包应该命名为hello_1.0-1_arm64.deb
- 程序运行的硬件架构
制作deb包
下面来制作deb包。确保你的系统中安装了dpkg-deb
程序,我们会用它来生成最终成品。
1.创建工作目录
创建一个临时的工作目录,来在其中制作deb包。
遵循之前讲的命名约定。
例如:
mkdir hello_1.0-1_arm64
2.创建内部结构
把你的程序文件放到应该被安装到的位置。
例如,假如你想将文件安装到/usr/local/bin
,
mkdir -p hello_1.0-1_arm64/usr/local/bin
mkdir
的-p
选项会创建上层目录。
下来把你的程序文件拷贝进包内的位置,
例如:
cp ~/YourProjects/Hello/hello hello_1.0-1_arm64/usr/local/bin
3.创建控制文件(control file)
控制文件(control file) 位于DEBIAN
目录下。注意是大写。
小写的debian
被用来存放源代码,叫做源包(原文:source packages),本教程是关于二进制包,所以不需要它。
先创建DEBIAN
目录:
mkdir helloworld_1.0-1_arm64/DEBIAN
然后创建空的控制文件(contorl file):
touch helloworld_1.0-1_arm64/DEBIAN/control
4.填写控制文件(control file)
用文本编辑器打开之前创建的控制文件(control),控制文件里是一些数据字段。对于二进制包,至少且必须包含下列字段:
- Package
- 程序名
- Version
- 程序版本号
- Architecture
- 目标系统硬件架构
- Maintainer
- 包维护负责人的姓名和邮箱地址
- Description
- 程序的简短描述
例如:
- 程序的简短描述
Package: hello
Version: 1.0
Architecture: arm64
Maintainer: Internal Pointers <[email protected]>
Description: A program that greets you.
You can add a longer description here. Mind the space at the beginning of this paragraph.
控制文件control也可以包含额外的有效字段,比如所属部分section
,或是依赖列表dependency list
。如果你的程序依赖外部库,那么后者相当重要。
你可以手动填写它,但是有帮助工具可以减轻负担,后面会告诉你的。
5.构建deb包
这是最后一步,调用dpkg-deb
,像下面这样:
dpkg-deb --build --root-owner-group <package-dir>
对我们的例子:
dpkg-deb --build --root-owner-group <helloworld_1.0-1_arm64>
--root-owner-group
标志使得deb包内容归roor用户所有,这也是标准方法。
如果没有这个标志,所有文件、文件夹都会被普通用户所有,然而,该用户在要安装的系统中可能不存在。
上面的命令会在工作目录旁生产一个.deb
包。如果包内部有错误或缺失,则打印错误信息,
如果成功了,你就得到了一个可供发布的deb包。
下面会介绍更多有用的内容。
测试deb包
测试你刚刚刚刚构建的deb包是个不错的选择。你可以安装它,就和安装其他deb包一样。
sudo dpkg -i <package>
确保它也能轻松卸载。你可以这样删除包:
sudo dpkg -r <appname>
或者连同它的配置文件一起删除(如果有):
sudo dpkg -P <appname>
可以这样来确保程序已经被正确删除:
dpkg -l |grep <appname>
dpkg -l
命令列出所以安装的包,然后用grep
检索程序名。当正确卸载后,输出应为空。
deb包安装出错
特别地,当你在处理一些 预安装/配置/删除 脚本时。dpkg
会有这样这样典型的报错:
Package is in a very bad inconsistent state - you should reinstall it before attempting a removal.
这会组织任何进展。解决方法:
将所有对损坏包的引用移动到安全的地方(比如/tmp
),然后强制删除它,就像这样:
sudo mv /var/lib/dpkg/info/<packagename>.* /tmp/
sudo dpkg --remove --force-remove-reinstreq <packagename>
处理外部依赖项
你可以使用dpkg-shlibdeps
自动生产外部依赖项。它会解析你的二进制文件,找到外部的符号。
在写作这篇教程时,这个工具似乎无法开箱即用。
由于某些未知的原因(对我),它需要工作目录下debian/control
文件——我们上文提到的源包(source packages)。
这里解决方法是先创建它,然后进入工作目录,运行命令:
dpkg-shlibdeps -O path/to/binaryfile
-O
选项会打印依赖项到标注你输出。复制并粘贴它到你的DEBIAN/control
的Depends
部分即可。
完成后就可以摆脱debian/control
文件了。我很确定,有更好的方法。一旦有该部分更多信息,我会更新该文章。
运行安装与卸载的处理脚本
有这四个文件:postinst
, preinst
, postrm
,prerm
被成为维护脚本。
这些文件位于DEBIAN
,如同它们的名字暗示的那样,preinst
和postinst
分贝在安装前后执行,而prerm
和postrm
分别在卸载前后执行。
它们必须被标记为可执行文件。当然,记得设置权限,必须在0555
和0755
之间。
来源
Debian Policy Manual
Debian documentation - Chapter 7. Basics of the Debian package management system
Unix StackExchange - How to uninstall a .deb installed with dpkg?
边栏推荐
- 利用go制作微信机器人
- 推荐系统:实时性【特征实时性:客户端实时特征(秒级,实时)、流处理平台(分钟级,近实时)、分布式批处理平台(小时/天级,非实时)】【模型实时性:在线学习、增量更新、全量更新】
- 明解C语言第七章习题
- 明解C语言第五章习题
- PR视频剪辑软件教程
- “数字化重构系统,搞定 CEO 是第一步”
- jOOQ是如何设计事务API(详细指南)
- mysqldump导出提示:mysqldump [Warning] Using a password on the command line interface can be insecure
- canvas基础讲解加示例
- Android Studio 实现登录注册-源代码 (连接MySql数据库)
猜你喜欢
MVC模式和三层架构
Recommendation system: evaluation index [offline evaluation index: RMSE (root mean square error), AUC, precision, recall, F1] [online evaluation: A/B test] [generally required response time <0.5s]
mysql8安装步骤教程
To the operation of the int variable assignment is atom?
银行数据资产转换能力弱?思迈特软件助力解决银行困境
PR视频剪辑软件教程
基于人脸的常见表情识别(1)——深度学习基础知识
excel数字显示e+17怎么恢复?excel数字变成了小数点+E+17的解决方法
YOLO V3详解
WPS没有在任务栏显示所有窗口选项怎么回事?
随机推荐
Apple Silicon配置二进制环境(一)
SQLyog注释 添加 撤销 快捷键
Running the evict task with compensationTime
MySQL 高级(进阶) SQL 语句 (一)
并发与并行的区别
MySQL——几种常见的嵌套查询
Recommendation System - Sorting Layer - Model (1): Embedding + MLP (Multilayer Perceptron) Model [Deep Crossing Model: Classic Embedding + MLP Model Structure]
PPT如何开启演讲者模式?PPT开启演讲者模式的方法
推荐系统:实时性【特征实时性:客户端实时特征(秒级,实时)、流处理平台(分钟级,近实时)、分布式批处理平台(小时/天级,非实时)】【模型实时性:在线学习、增量更新、全量更新】
Multi-threaded mutex application RAII mechanism
MySQL数据库字段超长问题
MySQL 多表关联一对多查询实现取最新一条数据
Zabbix部署与练习
PR视频剪辑软件教程
vlookup函数匹配不出来的原因及解决方法
GateWay实现负载均衡
Mysql8创建用户以及赋权操作
WPS表格怎么自动1234排下去?wps表格怎么自动生成序号?
【回归预测-CNN预测】基于卷积神经网络CNN实现数据回归预测附matlab代码
基于人脸的常见表情识别(1)——深度学习基础知识