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

如何解决如何使用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。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?