【问题标题】:Future-safe version numbers in pip freeze outputpip freeze 输出中未来安全的版本号
【发布时间】:2014-03-19 09:18:00
【问题描述】:

如果我输入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 会引发错误,说没有找到h5py 的2.2.0 版本:

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

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

【问题讨论】:

    标签: python deployment pip


    【解决方案1】:

    要回答第一个问题,是的,使用 pip freeze 来管理需求是很常见的。如果您的项目已打包,您还可以直接在 setup.py 文件中设置依赖项。

    您可以将要求设置为大于或等于版本 x,但正如您推测的那样,如果依赖项对其 api 进行更改而破坏了您所需的功能,这可能会反过来并咬您一口。您还可以确保安装的依赖项小于某个版本。即,如果您使用的是 1.0 版本的软件包,并且想要进行次要更新,但主要版本让您感到害怕(无论它是否已发布),您可以要求 example>=1.0.0,

    More info on requirements files

    最后,pip freeze 只是一个向您展示您当前安装的工具的工具,它不知道也不关心它是否适合您。你用什么来基于这些数据复制环境也并不重要。版本冲突、破坏向后兼容性的更新、错误和其他依赖项中的此类问题将(至少一次)让您感到悲伤。密切关注项目主要依赖项的状态并使用新版本进行自动化测试将为您节省大量时间和头疼(或至少头疼)。

    【讨论】:

    • 您好,谢谢您的回复。您能否添加一些有关如何以未来安全的方式实际管理依赖项的信息?我听说托管自己的存储库。所以 pip 不会在官方索引中搜索,而是依赖你自己的服务器。你知道怎么做吗?
    • 您当然可以管理自己的存储库,尽管大多数只对内部创建的包执行此操作。在你自己的仓库中管理外部包是一件痛苦的事(但可行)。
    • 要在您自己的存储库中管理您的外部第三方依赖项,请使用:requirements.txt 顶部的“--find-links myrepo.com”。代价是,只要您想(稳定地)更新项目中的依赖项,就必须更新您的 cheeseshop(repo)。如果您正在制作任何商业产品,我强烈建议您控制您的依赖项。
    猜你喜欢
    • 2019-12-17
    • 1970-01-01
    • 1970-01-01
    • 2012-08-09
    • 2018-06-22
    • 2021-09-26
    • 2017-01-27
    • 2016-05-30
    • 2012-10-27
    相关资源
    最近更新 更多