本文介绍如何为Debian/Ubuntu制作
.deb安装包
介绍
本文介绍两种制作 .deb 包
手动制作
依赖安装
- 安装制作 .deb 包依赖
apt install build-essential binutils lintian debhelper dh-make devscripts初始化
- 检查新的报名是否已被使用
apt-cache search <pkg-name>-
确认 License,通常为
GNU/GPL license -
创建目录
mkdir -p helloworld/DEBIAN- 在目录
helloworld/DEBIAN创建control文件(参考),内容如下
cat << EOF > helloworld/DEBIAN/control
Package: helloworld
Version: 0.2
Maintainer: me@xiexianbin.cn
Architecture: all
Description: hello world
EOF- 在目录
helloworld/DEBIAN创建postinst文件,需要有可执行权限
$ cat << EOF > helloworld/DEBIAN/postinst.ex
#!/bin/sh
# postinst script for abc
echo "..."
exit 0- 复制文件到安装包,以路径
helloworld/相对 Linux 系统的根目录/
$ mkdir -p helloworld/usr/local/bin
$ cat << EOF > helloworld/usr/local/bin/helloworld.sh
#!/bin/bash
echo "hello world!"
EOF创建软件包
dpkg-deb --build helloworld测试
dpkg -i helloworld.deb解压到extract文件夹
dpkg-deb -b extract build/使用 dh-make 创建
依赖安装
apt install build-essential binutils lintian debhelper dh-make devscripts环境变量
export DEBEMAIL="me@xiexianbin.cn"
export DEBFULLNAME="xiexianbin"初始化
使用 dh_make 初始化
# 目录初始化
$ mkdir abc-1.0.0 && cd abc-1.0.0
# 安装包的文件
$ cat << EOF > abc
echo `date`
EOF
$ chmod a+x abc- 在目录
abc-1.0.0下执行,并生成debian目录
$ dh_make --createorig -s
$ tree debian/
debian/
├── abc.cron.d.ex
├── abc.doc-base.EX
├── abc-docs.docs
├── changelog # 变更记录文件
├── control # control文件
├── copyright
├── manpage.1.ex
├── manpage.sgml.ex
├── manpage.xml.ex
├── postinst.ex # 安装时执行的脚本
├── postrm.ex
├── preinst.ex # 安装前执行的脚本
├── prerm.ex # 删除时执行的脚本
├── README.Debian
├── README.source
├── rules # rules 文件
├── salsa-ci.yml.ex
├── source
│ └── format
└── watch.ex
1 directory, 19 files-
修改
debian/rules -
修改
debian/postinst.ex,指定安装时的操作
cat debian/postinst.ex
#!/bin/sh
# postinst script for abc
case "$1" in
configure)
chmod a+x /usr/local/bin/abc
# or start service
;;
abort-upgrade|abort-remove|abort-deconfigure)
;;
*)
echo "postinst called with unknown argument \`$1'" >&2
exit 1
;;
esac
...
exit 0- 创建 install 文件,指定文件的安装目录
cat << EOF > debian/install
abc /usr/local/bin/
EOF打包
# 生成debian包描述文件
dpkg-source -b .
# 打包文件
dpkg-buildpackage
# 调试方式
dpkg-buildpackage -nc -i
dpkg-buildpackage -uc -us安装
- 编译后,安装包在上级目录
$ ls ../
abc_1.0.0-1_amd64.deb ...deb 文件格式
$ file abc_1.0.0-1_amd64.deb
abc_1.0.0-1_amd64.deb: Debian binary package (format 2.0), with control.tar.xz, data compression xz本地deb软件源
方法一
生成 Packages 文件:在软件源目录中运行以下命令,生成 Packages 文件:
apt-get install dpkg-dev
# 到 deb 包目录执行
dpkg-scanpackages packages . /dev/null | gzip -9c > Packages.gz
dpkg-scanpackages sources . /dev/null | gzip -9c > Sources.gz这将扫描软件源目录中的软件包,并生成一个压缩的 Packages.gz 文件。
apt-ftparchive packages . > Packages
apt-ftparchive release . > Release- 源配置
deb file:///data/packages/ hasty main universe multiverse
# 或
deb file:///var/ packages/方法二:apt-ftparchive
以下操作在 /data/debs 目录下进行
- 生成索引文件(使用与 apt > 1.5 的版本)
apt-ftparchive packages . > Packages
apt-ftparchive release . > Release- 生成 gpg 签名私钥信息
$ gpg --gen-key- 添加私钥
$ gpg -a --export <gpg-uuid> | apt-key add -
OK- 认证
gpg --clearsign -o InRelease Release
gpg -abs -o Release.gpg Release- 配置
/etc/apt/sources.list文件,或使用 nginx 对外发布
deb file:///data/debs/ /其他
- sbuild
F&Q
No secret key
- 错误日志
$ dpkg-buildpackage
...
gpg: skipped "Name Lastname <your@mail.com>": No secret key
gpg: dpkg-sign.GW_cpMSS/abc_1.0.0-1.dsc: clear-sign failed: No secret key
dpkg-buildpackage: error: failed to sign .dsc file- 编译命令
dpkg-buildpackage --no-sign