我如何使用 stdeb3/py2dsc 和 dpkg-buildpackage 将 python 应用程序与 systemd 单元进行 Debian 打包?

How can I Debian-package a python application with a systemd unit using stdeb3/py2dsc and dpkg-buildpackage?

我想做的是为 Python3 应用程序创建一个 Debian 包,并让该包安装相关的 systemd 服务,并在删除或更新该包时 remove/update 它。

我有一个 Python3 程序,我想将其捆绑到 Ubuntu 18.04 上的 Debian 软件包中。我已经能够使用 setup.pystdeb3.

附带的 py2dsc 程序成功地做到这一点
$ python setup.py sdist
$ py2dsc dist/mypackage-0.0.1.tar.gz
$ (cd deb_dist/mypackage-0.0.1/ && dpkg-buildpackage -rfakeroot -uc -us)

这会创建一个可安装的 .deb,除了对 Python 3.6 的奇怪 py2dsc 依赖之外,即使我使用的是 3.8,它也运行良好。

py2dsc 创建一个 debian staging 树,包括 debian/rules 和:

#!/usr/bin/make -f

export PYBUILD_NAME=mypackage
%:
    dh $@ --with python3 --buildsystem=pybuild

接下来我想让这个包安装一个 systemd 服务单元,它将 运行 Python3 程序。 我认为服务文件需要调用 python3-mypackage.service 来匹配 <package-name>.service,因为 py2dscpython3- 添加到包名称前。

我做了一些研究,发现 debian/rules 中的 dh 命令应该包含 [=29=,而不是破解 pre/postinst 脚本] 选项,我需要在我的 Ubuntu 18.04 系统上安装 dh-systemd。为此,我在 运行ning py2dsc 之后暂停,将相关条目添加到 debian/rules,然后 运行 dpkg-buildpackage.

由于我不明白的原因,在dpkg-buildpackage的输出中没有提到dh-systemd

...
   dh_installdocs -O--buildsystem=pybuild
   dh_installchangelogs -O--buildsystem=pybuild
   dh_python3 -O--buildsystem=pybuild
   dh_perl -O--buildsystem=pybuild
   dh_link -O--buildsystem=pybuild
   dh_strip_nondeterminism -O--buildsystem=pybuild
   dh_compress -O--buildsystem=pybuild
   dh_fixperms -O--buildsystem=pybuild
   dh_missing -O--buildsystem=pybuild
   dh_installdeb -O--buildsystem=pybuild
   dh_gencontrol -O--buildsystem=pybuild
   dh_md5sums -O--buildsystem=pybuild
   dh_builddeb -O--buildsystem=pybuild
...

我四处搜索,虽然我可以找到人们构建 python 包的例子,以及人们用 systemd Units 构建包的例子,但我没能找到有人打包 python 包的例子=61=] 项目和关联的 systemd 单元,所以我不确定从这里去哪里。我想知道 pybuild 的使用是否与 --with systemd 的使用冲突?

如果您要使用 dpkg-buildpackage,您应该根据 python packaging documentation 创建 debian/ 目录和那里的所有文件。这将创建一个完全符合政策的 Debian 软件包。 stdeb 软件包只提供了一种创建 Debian 软件包的快速而肮脏的方法。如果您打算在 Debian 存储库中发布此软件包,使用 stdeb 会适得其反。

使用此方法,you can use the dh_systemd helper,并使用 debcompat >= 10 自动激活它。服务文件必须在 Debian 目录中 packagename.service。