如何防止 Pypi 包维护者决定删除包?

问题描述 投票:0回答:3

似乎可以删除 Pypi 的软件包(或软件包版本):如何从 Pypi 中删除软件包

如果您已经完成了某些软件的开发并希望在构建时能够从 Pypi 中提取依赖项,这可能会成为问题。

防止这种情况的最佳做法是什么?

python pypi
3个回答
3
投票

不必要的_介绍=<< SKIP_HERE

事实上,这是一个比仅仅阻止另一个 leftpad 实例更深层次的问题。 一般来说,依赖关系管理的实践是由通常是隐含的社区规范定义的。从这个意义上说,Python 尤其糟糕,因为它不仅隐含了这些规范,而且它的包管理工具也是建立在不保证依赖兼容性的前提下的。自从 PyPI 出现以来,两个包安装程序都不能保证安装兼容版本的依赖项。如果包 A 需要包 B==1.0 和 C==1.0,而 C 需要包 B==0.8,那么安装 A 后,您最终可能会得到 B==0.8,即 A 依赖项将无法得到满足。

在此跳过

0。明智地选择,使用信号。

开发人员和软件包维护人员都知道这种情况。人们试图通过选择“好的”项目来最大程度地减少这种破坏的可能性,即拥有一个健康的社区,其中一个人不太可能做出此类决定,并且能够在不太可能发生的情况下恢复项目。

这些信号的设计和评估是一个活跃的研究领域。最常用的因素是包贡献者的数量(总线因素)、健康实践(测试、CI、文档质量)、GitHub 上的分叉数量、星星等。

1.将包代码复制到您的源代码树下

如果您不希望包发生很大变化,但又担心包被删除或发生重大更改,这是最简单的场景。它还为您提供了根据您的需求定制软件包的优势;另一方面,现在的软件包更新将需要相当多的努力。

2.在 PyPI 上重新发布包的副本

我不记得确切的名称,但其他开发人员以不同的名称重新发布了一些引人注目的软件包。在这种情况下,您所需要的只是复制包文件并重新发布,这可能比在源代码树下维护副本便宜。不过,它看起来很脏,我不鼓励这样做。

3.私人 PyPI 镜像

#2 的更干净但更昂贵的版本。

4.另一层抽象

有些人选择很少的竞争性替代方案,并在它们之上创建一个抽象,能够使用不同的“后端”。这样做的原因通常是不应对可能的包删除,并且根据接口的复杂性,它可能会非常昂贵。这种抽象的一个例子是 Keras,它是一种神经网络抽象,它为张量流和 theano 后端提供了一致的接口

5.还有更多选择

更奇特的选项包括分发虚拟环境/容器/VM 的快照、重新实现 packagegage(特别是由于许可问题)等。


1
投票

您可以创建自己的本地 PyPI 镜像(在其中更新、添加、删除策略上的包)并使用本地 PyPI 镜像进行将来的包安装/更新。完整镜像的 PyPI 将消耗大约 30GB 的存储空间,因此您只需要 30-40GB 的存储空间。

创建本地pypi镜像的方法有很多种。例如 如何滚动我自己的 pypi?


0
投票

我也被这个问题咬过很多次了;并认为正确解决此问题的唯一方法是创建 PyPI 注册表的完整每日快照(类似于 Debian 为软件包注册表创建快照的方式)。然后你可以固定一个日期 => 总是得到相同的树,删除的包/版本并不重要。因为这应该对更多的人有帮助,所以我帮助将这些快照设置为 StableBuild 的一部分(需要注册,但提供免费套餐)。其中包含可追溯到 2023 年 9 月的完整快照。 PyPI 镜像文档在这里

无论如何,您可以使用这些快照做的一件有趣的事情是查看哪些包和版本曾经从 PyPI 中删除;因此,我们设置了已删除的 PyPI 包索引,该索引每天都会更新,并列出所有已删除的 Python 包、版本和轮子。您可以免费下载任何已删除的轮子,无需注册。例如。这是几天前删除的 jaxlib 0.4.4: https://dashboard.stablebuild.com/pypi-deleted-packages/pkg/jaxlib/0.4.4 .

© www.soinside.com 2019 - 2024. All rights reserved.