如何防止 Pypi 包维护者决定删除包?
How to protect against Pypi package maintainers deciding to remove a package?
似乎可以删除 Pypi 的包(或包版本):How to remove a package from Pypi
如果您已经完成了某些软件的开发并希望在构建时能够从 Pypi 中提取依赖项,这可能是个问题。
防止这种情况的最佳做法是什么?
您可以创建自己的本地 PyPI 镜像(您可以在其中更新、添加、删除策略中的包)并将本地 PyPI 镜像用于未来的包 installations/update。完整镜像的 PyPI 将消耗大约 30GB 的存储空间,因此您只需要 30-40GB 的存储空间 space。
创建本地pypi镜像的方法有很多种。例如 How to roll my own pypi?
Unnecessary_intro=<< SKIP_HERE
事实上,这比仅仅防止另一个 leftpad 实例更深层次的问题。
一般来说,依赖管理的实践是由社区规范定义的,这些规范通常是隐含的。 Python 在这个意义上尤其糟糕,因为它不仅隐含了这些规范,它的包管理工具也建立在不保证依赖兼容性的前提下。自从 PyPI 出现以来,包安装程序都没有保证安装兼容版本的依赖项。如果包 A 需要包 B==1.0 和 C==1.0,而 C 需要 B==0.8,那么在安装 A 之后,您可能最终会得到 B==0.8,即 A 依赖项将无法满足。
SKIP_HERE
0。明智地选择,使用信号。
开发人员和包维护人员都知道这种情况。人们试图通过 select 进行“好”项目来尽量减少这种中断的可能性,即拥有一个健康的社区,一个人不太可能做出这样的决定,并且能够在不太可能发生的情况下恢复项目。
这些信号的设计和评估是一个活跃的研究领域。最常用的因素是包贡献者的数量(总线因素)、健康实践(测试、CI、文档质量)、GitHub 上的分叉数量、星星等
1。复制你源码树下的包代码
如果您不希望包发生太大变化但害怕包删除或破坏性更改,这是最简单的方案。它还为您提供了根据您的需要定制包的优势;另一方面,包更新现在需要相当多的努力。
2。在 PyPI
上重新发布包的副本
我不记得确切的名称,但一些知名度很高的软件包已由其他开发人员以不同的名称重新发布。在这种情况下,您所需要的只是复制包文件并重新发布,这可能比在源代码树下维护一个副本要便宜。不过它看起来很脏,我不鼓励这样做。
3。私有 PyPI 镜像
#2 的更清洁但更昂贵的版本。
4。另一层抽象
有些人 select 很少有竞争的替代方案,并在它们之上创建一个抽象,能够使用不同的“后端”。这样做的原因通常是不应对可能的包删除,并且根据接口的复杂性,它可能非常昂贵。这种抽象的一个例子是 Keras,它是神经网络的抽象,它为 tensorflow 和 theano 后端提供一致的接口
5。还有更多选择
更多奇特的选择包括分发虚拟 environments/containers/VMs 的快照、重新实现 packgage(尤其是由于许可问题)等
似乎可以删除 Pypi 的包(或包版本):How to remove a package from Pypi
如果您已经完成了某些软件的开发并希望在构建时能够从 Pypi 中提取依赖项,这可能是个问题。
防止这种情况的最佳做法是什么?
您可以创建自己的本地 PyPI 镜像(您可以在其中更新、添加、删除策略中的包)并将本地 PyPI 镜像用于未来的包 installations/update。完整镜像的 PyPI 将消耗大约 30GB 的存储空间,因此您只需要 30-40GB 的存储空间 space。
创建本地pypi镜像的方法有很多种。例如 How to roll my own pypi?
Unnecessary_intro=<< SKIP_HERE
事实上,这比仅仅防止另一个 leftpad 实例更深层次的问题。 一般来说,依赖管理的实践是由社区规范定义的,这些规范通常是隐含的。 Python 在这个意义上尤其糟糕,因为它不仅隐含了这些规范,它的包管理工具也建立在不保证依赖兼容性的前提下。自从 PyPI 出现以来,包安装程序都没有保证安装兼容版本的依赖项。如果包 A 需要包 B==1.0 和 C==1.0,而 C 需要 B==0.8,那么在安装 A 之后,您可能最终会得到 B==0.8,即 A 依赖项将无法满足。
SKIP_HERE
0。明智地选择,使用信号。
开发人员和包维护人员都知道这种情况。人们试图通过 select 进行“好”项目来尽量减少这种中断的可能性,即拥有一个健康的社区,一个人不太可能做出这样的决定,并且能够在不太可能发生的情况下恢复项目。
这些信号的设计和评估是一个活跃的研究领域。最常用的因素是包贡献者的数量(总线因素)、健康实践(测试、CI、文档质量)、GitHub 上的分叉数量、星星等
1。复制你源码树下的包代码
如果您不希望包发生太大变化但害怕包删除或破坏性更改,这是最简单的方案。它还为您提供了根据您的需要定制包的优势;另一方面,包更新现在需要相当多的努力。
2。在 PyPI
上重新发布包的副本我不记得确切的名称,但一些知名度很高的软件包已由其他开发人员以不同的名称重新发布。在这种情况下,您所需要的只是复制包文件并重新发布,这可能比在源代码树下维护一个副本要便宜。不过它看起来很脏,我不鼓励这样做。
3。私有 PyPI 镜像
#2 的更清洁但更昂贵的版本。
4。另一层抽象
有些人 select 很少有竞争的替代方案,并在它们之上创建一个抽象,能够使用不同的“后端”。这样做的原因通常是不应对可能的包删除,并且根据接口的复杂性,它可能非常昂贵。这种抽象的一个例子是 Keras,它是神经网络的抽象,它为 tensorflow 和 theano 后端提供一致的接口
5。还有更多选择
更多奇特的选择包括分发虚拟 environments/containers/VMs 的快照、重新实现 packgage(尤其是由于许可问题)等