Python:我应该离线保存 PyPi 包作为备份吗?

ibr*_*hem 9 python maintainability pypi

我的 Python 项目很大程度上依赖于 PyPi 包
我想确保:在未来的任何时候:我的应用程序所需的包将始终在 PyPi 上在线可用。
例如:-
我在 Github 上发现了一个需要 PyQt4 的项目。
当我尝试在我的 Linux 机器上运行它时,
它在启动时崩溃,因为它在 PyPi 上找不到 PyQt4 包。

注意:我知道 PyQt4 已被弃用

我进行了大量搜索以找到仍然包含 PyQt4 包的 PyPi 存档,但我在任何地方都找不到它们。

所以我必须重写该应用程序才能使其在 PyQt5 上运行。
我只更改了与UI相关的代码(即:PyQt4)。
其他功能仍在运行。

所以该应用程序的唯一问题是 PyQt4 包已从 PyPi 中删除。



所以,我的问题是:我应该保存我使用的 PyPi 包的备份吗?

Ous*_*uss 5

简洁版本:

是的,如果您想要可用性...下一个大问题是如何最好地保留依赖项的备份版本?这个答案的最后有一些建议。

长版:

您的问题涉及“可用性”的概念,这是信息保障(或信息安全)的三大支柱之一。另外两个支柱是保密和诚信……中央情报局三合会。

PyPI 包由这些包的所有者维护,依赖于包并将其列为依赖项的项目必须考虑包的所有者将包或包的版本从 PyPI 中拉出的可能性:任何时候。

具有许多依赖项的重要 Python 包通常由基金会或组织维护,这些基金会或组织更负责处理下游依赖包和项目。然而,保持对旧包的支持成本非常高,并且需要额外的努力,维护人员通常会设置终止支持的日期,或者发布包生命周期,其中说明何时从公共 PyPI 服务器中删除特定版本。

一旦发生这种情况,依赖者必须更新他们的代码(就像你所做的那样),或者通过替代方式提供原始依赖项。

这个主题对于图书馆、大学、实验室、公司和政府机构的采购非常重要,因为这些地方的软件工具可能依赖于其他软件包(或生态系统),并且应充分解决“可用性”问题。

解决这一风险可能意味着从不惜一切代价确保高可用性到承受失去一个或多个依赖项的风险……应使用风险管理方法来做出影响项目“安全”的明智选择。

还应该指出的是,某些软件包需要二进制可执行文件或二进制库或访问在线 API 服务,这些服务也应该可供软件包正常工作,这使风险分析变得复杂,并使解决可用性所需的活动变得复杂。

现在为了确保依赖项始终可用...我快速编译了以下列表。请注意,每个选项都有优点和缺点。您应该根据您的需求评估这些和其他选项:

  1. 将虚拟环境与代码一起存储。创建虚拟环境并在该虚拟环境中安装项目所需的软件包后,您可以将虚拟环境保留为存储库的一部分,例如供后代使用。
  2. 托管您自己的 PyPI 实例(或镜像)并保留托管在其上的依赖包的副本:https ://packaging.python.org/en/latest/guides/hosting-your-own-index/
  3. 使用“工件管理工具”,例如来自https://jfrog.com/artifact-management/的 Artifactory ,您不仅可以在其中托管 python 包,还可以托管 Docker 映像、nmap 包和其他类型的工件。
  4. 获取所有依赖项的源代码,并始终从源代码构建。
  5. 创建一个项目正常运行的 Docker 镜像,并保留该镜像的备份。
  6. 如果该包需要在线 API 服务,请考虑替换该服务或用您可以控制的服务来模拟它。