这个问题试图补充这个。我有一个使用 PyPI 第三方模块的 Python 应用程序。我想将我的应用程序打包成 Debian 包,但不知道如何处理不在 Debian/ubuntu 存储库中的 Python 依赖项(也打包为 Debian 包)
解决方案#1:
将 PyPI 中的模块直接构建到我的 debian 包中。
解决方案 #2:
为我需要的所有 PyPI 模块创建 debian 包标准普尔并将它们添加到 debian/ubuntu 存储库。
我确实需要一个解决方案 #3因为我想在安装我的 debian 包时安装 PyPI 依赖项,最好是安装到虚拟环境中!
会是什么解决方案 #3我需要调整吗DEBIAN/preinst 维护者脚本?
答案1
我在 Debian IRC 频道上与一些维护人员进行了交流irc://irc.debian.org#debian-mentors,要求完全相同的事情,普遍的共识是:
解决方案#1:
通过将依赖项的源文件复制为单个代码库来集成到包中非常不赞成。这会破坏处理依赖关系、更新、版本控制等的打包系统的目的。
解决方案 #3:
在安装二进制文件时下载非 Debian 软件包(.deb
)是一种严肃的安全风险,绝对不行。你甚至不能检查 通过提取 来卸载依赖项deb
,因为它们是在安装时下载和安装的。这是一种完全绕过存储库系统的方法。没有一个关心的用户会对在后台(记住root
!)从不受信任的来源下载其他不受信任的软件的软件包感到满意。是的,这需要摆弄DEBIAN/postinst
(或preinst
)并发出wget
(或,在您的情况下为pip install
),而这正是 Flash、Oracle Java、Steam 和其他公司采用的方法。但那是专有的闭源软件,所以它们的安全性无论如何都不是。
解决方案 #1.5:
你没有提到,但你只能在构建时间即在来源软件包(.orig.tar.gz
、.debian.tar.gz
、.dsc
三元组),在创建“二进制”软件包(.deb
)时从 PyPi 下载。 的指令pip install
将进入debian/rules
(请注意小写的debian
,而不是二进制软件包),并将在您发出debuild
或时执行dpkg-buildpackage
。
这是 #1 和 #3 之间的折衷方案。它缓解了(但并未解决!)#3 中的一些问题:至少您可以检查最终产品,并且.deb
在安装时不需要互联网访问。所有风险和负担都从最终用户转移到软件包维护者。但是,它存在与 #1 相同的问题,因为它绕过了大部分打包系统基础设施。毕竟,处理依赖关系(版本、更新、要求、冲突)是dpkg
/apt
最初被创建的原因!:)
解决方案 #2:
这唯一正确方法™。您可以为您的依赖项创建 Debian 包,将它们列为您的包中的要求,并发送所有.debs
或源包。
从那里,您有多种选择:
提交源包(包括您的软件及其依赖项)可纳入 Debian。如果被接受,它们将自动可供所有 Debian 用户使用,包括所有衍生产品(如 Ubuntu)。
将源码包上传至发射台,从而创建一个电力供应协议任何 Ubuntu 用户(以及 Linux Mint 等衍生产品)都可以轻松添加和安装
在您的网站中托管您自己的 Debian 存储库,任何基于 Debian 的系统的用户都可以添加到他们的存储库
/etc/apt/sources.list.d
并使用apt
基础架构下载、安装和保持更新(如上所示!)托管
.deb
文件以供直接下载和安装。无需apt
考虑自动更新。
至于如何要打包你的 PyPi 依赖项(以及你的 Python 软件!),有许多工具和参考资料可以使这个过程变得简单:
还有许多有用的参考资料:
需要帮助?请查看:
答案2
可以pypi2deb
从pypi获取一个包并将其制作成deb包。
答案3
我认为你只需要将相关的命令行代码添加到 .deb 包中的 postinst 脚本中即可。这个答案,更多详情请参阅官方 Debian 指南。
答案4
使用dh-虚拟环境它将把 pip 项目打包成带有 virtualenv 的 Debian 包(包含所有依赖项)。
sudo apt install dh-make dh-virtualenv
你需要一个带有setup.py
(和pyproject.toml
或requirements.txt
) 的 Python 项目。在该项目内生成debian/
目录,例如使用:
dh_make --indep --createorig --native --packagename mypackage_0.1.0
删除示例文件:
rm debian/*.ex debian/*.EX debian/README.*
更新构建依赖项debian/control
Build-Depends: debhelper (>= 11), python3, dh-virtualenv (>= 1.0)
编辑debian/rules
:
%:
dh $@ --with python-virtualenv
最后尝试使用以下命令构建包:
( deactivate ; dpkg-buildpackage -us -uc -b )
看文献更多细节。