pip freeze 输出中的版本号是否未来兼容?

7
如果我输入 pip freeze > requirements.txt,生成的文件看起来类似于这样:
argparse==1.2.1  
h5py==2.2.0  
wsgiref==0.1.2

一些库正在持续开发中。这也发生在我使用 h5py 时,它现在(截至本文撰写)可用于版本2.2.1。因此,使用pip install -r requirements.txt会出现错误,说找不到2.2.0版本的 h5py:

No distributions matching the version for h5py==2.2.0 (from -r requirements.txt (line 2))

是否通过pip freeze来维护需求是一个好的做法?显然,我不能指望特定版本号在未来仍然可用。我希望将来能够部署我的应用程序,即使它们已经存在多年,也不会出现与版本号相关的兼容性问题。有没有办法使pip freeze的输出对未来更加安全?

我考虑通过使用大于等于符号>=而不是等于符号==来操作pip freeze的输出文件,这样输出将如下所示:

argparse>=1.2.1  
h5py>=2.2.0  
wsgiref>=0.1.2

但我可以想象,如果任何库在未来版本中破坏了向后兼容性,这将会破坏我的应用程序。

1个回答

4
为了回答第一个问题,是的,使用pip freeze来管理需求很常见。如果您的项目已打包,您也可以直接在setup.py文件中设置依赖项。
您可以将要求设置为大于或等于版本x,但正如您所推测的那样,如果依赖性对其API进行更改以破坏您所需的功能,这可能会反弹并咬你一口。您还可以确保已安装的依赖项小于某个版本。例如,如果您使用1.0版的软件包,并希望进行小型更新,但是主要版本发布令您感到恐惧(无论它是否已发布),则可以要求example>=1.0.0,<2.0.0
更多有关需求文件的信息,请查看此处 最终,pip freeze只是一个工具,用于显示当前安装的内容,它不知道也不关心它是否适合您。您用于基于此数据复制环境的工具也并不重要;依赖项中的版本冲突,更新破坏向后兼容性,错误和其他类似问题至少会让你伤心。及时跟踪项目的主要依赖项状态并使用新版本进行自动化测试将为您节省大量时间和麻烦(或至少减轻麻烦)。

嗨,感谢您的回复。您能否添加一些关于如何以未来安全的方式管理依赖项的信息?我听说过托管自己的存储库。这样pip就不会在官方索引中搜索,而是依赖于您自己的服务器。您知道如何做到这一点吗? - schreon
你肯定可以管理自己的代码库,尽管大多数人只是为内部创建的软件包这样做。在自己的代码库中管理外部软件包很麻烦(但可行)。 - Zeb
要在自己的存储库中管理外部第三方依赖项,请在requirements.txt顶部使用:"--find-links https://myrepo.com"成本是每当您想要(稳定地)更新项目中的依赖项时,必须更新您的cheeseshop(存储库)。如果您正在生产任何商业产品,我强烈建议掌控您的依赖关系。 - DylanYoung

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接