我想做的是为Python3应用程序创建一个Debian包,让该包安装一个相关的systemd服务,并在删除或更新该包时删除/更新它。
我有一个Python3程序,我想把它捆绑到Ubuntu18.04上的Debian包中。我已经能够用setup.py
和stdeb3
附带的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,除了对Python3.6的奇怪的py2dsc
依赖之外,即使我使用的是3.8,它也能很好地工作。
py2dsc
创建一个debian阶段树,包括debian/rules
和:
#!/usr/bin/make -f
export PYBUILD_NAME=mypackage
%:
dh $@ --with python3 --buildsystem=pybuild
接下来我想让这个包安装一个systemd服务单元,它将运行Python3程序我认为需要调用服务文件python3-mypackage.service
来匹配<package-name>.service
,因为py2dsc
在包名称前加了python3-
。
我做了一些研究,发现debian/rules
中的dh
命令应该添加--with systemd
选项,而不是破解pre
/postinst
脚本,我需要在Ubuntu 18.04系统上安装dh-systemd
。为了实现这一点,我在运行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单元构建包的人,但我还没有找到一个同时打包python项目和相关systemd单元的例子,所以我不确定该从哪里着手。我想知道pybuild
的使用是否与--with systemd
的使用相冲突?
如果您要使用dpkg构建包,您应该根据python打包文档创建debian/目录和那里的所有文件。这将创建一个完全符合策略的Debian包。stdeb包只提供了一种快速而肮脏的方法来创建Debian包。如果您打算在Debian存储库中发布此包,那么使用stdeb会适得其反。
使用此方法,您可以使用dh_systemd帮助程序,并使用debcompat>=自动激活它10.服务文件必须是Debian目录上的packagename.service。