如何使用stdeb3 / py2dsc和dpkg-buildpackage将Debian打包为带有systemd单元的python应用程序?

问题描述

要做的是为python3应用程序创建一个Debian软件包,并让该软件包安装相关的systemd服务,并在删除或更新该软件包时将其删除/更新。

我有一个python3程序,希望将其捆绑到Ubuntu 18.04上的Debian软件包中。我已经能够通过setup.pypy2dsc附带的stdeb3程序成功地做到这一点。

$ 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过渡树,其中包括debian/rules并具有:

#!/usr/bin/make -f

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

下一步,我想让此软件包安装将运行python3程序的系统服务单元。我认为需要将服务文件称为python3-mypackage.service才能与<package-name>.service匹配,因为py2dsc在包名前加上python3-

我做了一些研究,发现pre中的postinst命令应该具有dh选项,而不是黑客debian/rules / --with systemd脚本添加,并且我需要在我的Ubuntu 18.04系统上安装dh-systemd。为此,我在运行py2dsc之后暂停,将相关条目添加debian/rules,然后运行dpkg-buildpackage

出于我不了解的原因,dh-systemd输出中没有提到dpkg-buildpackage

...
   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单元构建软件包的示例,但我找不到能够同时包装python项目和相关联的systemd Unit的示例。 ,所以我不确定从这里去哪里。我想知道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。