- Published on
Debian包
- Authors
- Name
- McDaddy(戣蓦)
主要针对如何打一个符合官方标准的deb包,如果不是官方的会简单很多
命令
dpkg
安装:
apt install dpkg
使用:
- 查看某个命令是由哪个软件包安装得来的
# 如想找下libtool是从哪里安装的
which libtool
# 得到/usr/bin/libtool
dpkg -S /usr/bin/libtool
# 得到 libtool-bin: /usr/bin/libtool
# 代表这个命令就是从libtool-bin来的
- 安装包
dpkg -i vco_1.0.0_amd64.deb
apt
apt是apt-get
和apt-cache
等工具的结合体,优先使用
使用:
- 查看一个包的信息:只列出这个包的信息,包括以下信息,但与有没有安装没关系
$ apt show libvterm-dev
Package: libvterm-dev
Version: 0~bzr718-1
Priority: optional
Section: libdevel
Source: libvterm
Maintainer: James McCoy <jamessan@debian.org>
Installed-Size: 118 kB
Depends: libvterm0 (= 0~bzr718-1)
Homepage: http://www.leonerd.org.uk/code/libvterm/
Tag: devel::library, role::devel-lib
Download-Size: 33.2 kB
APT-Sources: http://mirrors.debian.org/debian buster/main amd64 Packages
Description: abstract terminal library (development files)
- 查看一个包是否被安装,同时是从哪个源来
$ apt policy libtool-bin # 或者apt-cache policy libtool-bin
libtool-bin:
Installed: 2.4.6-9 # 表示已经安装的版本
Candidate: 2.4.6-9
Version table:
*** 2.4.6-9 500
500 http://mirrors.debian.org/debian buster/main amd64 Packages # 500/100表示优先级,优先会从500下载
100 /var/lib/dpkg/status
- 自动安装编译当前目录下软件源码所需的所有依赖包:
./
表示当前目录,通常这个目录下应该包含软件的源码包,特别是需要有debian/control
文件(该文件定义了编译此软件所需的依赖项)
apt build-dep ./
# 在control文件中依赖写成这样
Build-Depends: debhelper (>=10), git, cmake, build-essential, dh-golang, golang-any (>= 2:1.23~), libtool-bin
- 移除包
apt remove libvterm # 只删除软件包本身,保留配置文件
sudo apt purge libvterm0 libvterm-dev # 会删除软件包及所有相关配置文件,适合彻底清理不再需要的软件
- 列出包
apt list --installed # 只列出已安装的包
apt list --upgradable # 只列出可升级的包
apt list <包名> # 搜索特定包(支持通配符,如 apt list python*)
dpkg-buildpackage
打包工具,是通过安装dpkg-dev
这个包来的
dpkg-buildpackage -rfakeroot -us -uc -b
这个命令用来打包,其中-b表示只打二进制.deb文件,不打源代码包
打包准备与规范
目录要求
最重要的就是要在工程根目录下有一个debian目录,和几个必须的文件
# 和project同级目录获取编译结果
project/
##此目录执行apt build-dep ./
# 此目录执行dpkg-buildpackage -us -uc
├── a.c
├── b.c
├── debian
│ ├── changelog
│ ├── compat
│ ├── control
│ └── rules
└── updboot.sh
注意:最终打包出来的结果是在工程目录的上一层
control
核心文件之一,记录这个包的元信息,类似包的身份证
Source: vco # 包名和除非有多个包,否则和下面的Package一致
Section: utils # 类型,代表包的分类
Priority: optional # 是不是系统必须装的包
Maintainer: mcdaddy <mcdaddychen@126.com>
Build-Depends: debhelper (>=10), git, cmake, build-essential, golang-any (>= 2:1.23~), libtool-bin # 编译依赖
Standards-Version: 4.6.2 # 写死
Package: vco
Architecture: any # 支持多架构
Depends: ${misc:Depends}
Description: what is it
Long description starts here.
This line is also part of long description.
rules
可以理解为给debian工具读的Makefile,它里面包含了打包的整个生命周期,我们要做的就是在需要的节点写入自定义的步骤即可
#!/usr/bin/make -f
# 覆盖 dh_golang 的包检查步骤,跳过 dpkg-query 验证
override_dh_golang: # 仅执行必要的模块处理,不检查系统包
true
%:
dh $@ --with=golang # 关键:通过 --with=golang 启用 dh-golang 工具链
# (可选)自定义编译参数(如指定输出文件名、LDFLAGS 等)
override_dh_auto_build:
# 打印当前构建目录,确认是否在临时目录
echo "===== 当前构建目录: $(shell pwd) ====="
# 显式执行go build并输出详细错误
echo "===== 开始编译 ====="
go build -mod=mod -o vco
# 关键:将二进制文件复制到 debian 包临时目录
override_dh_auto_install:
# 创建目标目录(对应系统的 /usr/bin/)
install -d debian/vco/usr/bin/
# 复制根目录的 vco 到临时目录(权限 755 确保可执行)
install -m 755 vco debian/vco/usr/bin/
# 清理临时文件
override_dh_clean:
dh_clean
override_dh_builddeb:
# 执行你的最后操作(如删除临时依赖)
rm -rf vco # 同时清理根目录的 vco
# 执行默认的打包步骤
dh_builddeb