【问题标题】:As a python package maintainer, how can I determine lowest working requirements作为 python 包维护者,我如何确定最低工作要求
【发布时间】:2021-11-11 05:02:04
【问题描述】:

虽然可以简单地使用pip freeze 来获取当前环境,但不适合要求像我所使用的那样最前沿的环境。 此外,一些开发人员工具仅在最新版本的包中可用(想想类型注释),但用户不需要。 我的目标用户可能希望在缓慢升级的机器上使用我的包,并且我希望我的要求尽可能低。 例如,我不能要求比 Python 3.6 更好(即使那样我认为某些用户可能无法使用该包)。 同样,我想避免需要最新的 Numpy 或 Matplotlib 版本。

是否有(半)自动方式来确定每个依赖项的最旧兼容版本?

或者,我可以手动尝试使用旧包构建 conda 环境,但我必须随机尝试。 不幸的是,我继承了一个中等规模的代码库(~10KLoC),还没有进行自动化测试(我打算做一些,但是这需要一些时间,很遗憾这不是我的首要任务)。 要求也没有正确定义,所以我不知道两年前它是用什么运行的。

【问题讨论】:

  • 一个应用程序应该pip freeze 其当前要求并且要求完全按照该要求运行。但是库应该不那么严格,并允许最低要求的要求,确实。

标签: python dependencies backwards-compatibility python-packaging developer-tools


【解决方案1】:

因为 语义版本控制 并不总是得到尊重(而且因为从开发人员的角度来看,可能很难准确地为每个可能的用户确定什么是次要或主要更改),并且因为只有人类才能解析发行说明以了解发生了什么变化,没有简单的解决方案。

我的技术方法是使用 Python 和库版本的已知工作组合创建一个虚拟环境。从那里,一次一个版本地降级一个版本,一个库,验证它仍然可以正常工作(如果是手动和/或长时间检查可能会很困难)。

我的社交解决方案是将技术方法时间限制为不超过几个小时。然后满足于你所达到的。在自述文件中指出 lib 要求可能被夸大了,欢迎提供帮助。

如果没有您有信心的快速自动化测试,就无法自动探索 N 空间(每个库都是一个维度)以找到一些最小值。

【讨论】:

  • 我想基于时间的方法是一个很好的解决方法。我在想,鉴于 python 强大的自省能力,可能有一些方法可以分析包中实际使用的内容,并查看它存在于哪个版本的依赖项中。当然,如果一个函数改变了它的接口,它会使方法变得脆弱。类型注释可能会使这种方法在未来更加高效。也许我只需要写一个这样的工具。
  • @WIP Python 附带ast library,如果您也想尝试解析代码。虽然这个或您的建议可能会奏效,但发现语义变化难以置信非常困难,对于 Python 这样的动态语言尤其如此。我不会在工作时间尝试内省的方式,从我的角度来看这毫无意义。但是我可能错了,一些 PyGuru 可能会来给你一个非常聪明的解决方案。但更喜欢已知的方式:进行一些测试,并逐个库,逐个版本地一分为二。
  • 我确信这将是一项艰巨的任务,我确实不会尝试我的工作时间。编写这样一个工具可能比首先编写我的测试套件然后一分为二需要更多时间。不过,这将是一个有用的工具,我可能会在空闲时间研究它。
猜你喜欢
  • 2018-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-08
  • 2018-07-09
  • 1970-01-01
相关资源
最近更新 更多