检查需求是否最新
我正在使用 pip
的 需求文件 来管理我的依赖包列表。
我也尽量遵循最佳实践,确保在需求文件中提供准确的包版本。例如:
Django==1.5.1
lxml==3.0
我的问题是:有没有办法查看在 Python 包索引中,列在 requirements.txt
文件里的包是否有更新的版本可用?
就这个例子来说,目前 Django 和 lxml 的最新版本分别是 1.6.2 和 3.3.4。
我试过运行 pip install --upgrade -r requirements.txt
,但是它告诉我所有的包都是最新的:
$ pip install --upgrade -r requirements.txt
Requirement already up-to-date: Django==1.5.1 ...
请注意,此时我并不想实际升级包——我只是想看看是否有可用的更新。
4 个回答
新内容:
此外
$ pip list --outdated
$ pip install pip-check
$ pip-check
示例输出:
┌───────────────────────────┬────────────┬──────────┬────────────────────────────────────────────────────────┐
│ Major Release Update │ Version │ Latest │ │
├───────────────────────────┼────────────┼──────────┼────────────────────────────────────────────────────────┤
│ aiofiles │ 22.1.0 │ 23.1.0 │ https://pypi.python.org/pypi/aiofiles │
│ auth0-python │ 3.22.0 │ 4.3.0 │ https://pypi.python.org/pypi/auth0-python │
│ certifi │ 2022.12.7 │ 2023.5.7 │ https://pypi.python.org/pypi/certifi │
│ cryptography │ 40.0.2 │ 41.0.2 │ https://pypi.python.org/pypi/cryptography │
└───────────────────────────┴────────────┴──────────┴────────────────────────────────────────────────────────┘
┌────────────────────────────────────────┬──────────┬──────────┬─────────────────────────────────────────────────────────────────────┐
│ Minor Release Update │ Version │ Latest │ │
├────────────────────────────────────────┼──────────┼──────────┼─────────────────────────────────────────────────────────────────────┤
│ aiosqlite │ 0.18.0 │ 0.19.0 │ https://pypi.python.org/pypi/aiosqlite │
│ alembic │ 1.10.3 │ 1.11.1 │ https://pypi.python.org/pypi/alembic │
└────────────────────────────────────────┴──────────┴──────────┴─────────────────────────────────────────────────────────────────────┘
┌──────────────────────────────┬─────────────┬─────────────┬───────────────────────────────────────────────────────────┐
│ Unchanged Packages │ Version │ Latest │ │
├──────────────────────────────┼─────────────┼─────────────┼───────────────────────────────────────────────────────────┤
│ ansi2html │ 1.8.0 │ 1.8.0 │ https://pypi.python.org/pypi/ansi2html │
│ appnope │ 0.1.3 │ 0.1.3 │ https://pypi.python.org/pypi/appnope │
└──────────────────────────────┴─────────────┴─────────────┴───────────────────────────────────────────────────────────┘
旧内容:pip search 已被弃用
你可以在你的环境中(无论是虚拟环境还是非虚拟环境)简单地这样做:
pip freeze | cut -d = -f 1 | xargs -n 1 pip search | grep -B2 'LATEST:'
既然你提到喜欢遵循最佳实践,我猜你也在使用虚拟环境(virtualenv),对吧?假设是这样的话,既然你已经在锁定你的包了,有一个叫做pip-tools的工具可以在你的虚拟环境中运行,用来检查更新。
不过,这里有一个缺点,这也是我提到使用虚拟环境的原因。
这个工具会检查PyPI(Python包索引)并报告可用的更新。它使用当前安装的包列表来检查更新,而不是使用任何requirements.txt文件。
如果你在虚拟环境中运行它,你可以很容易地看到哪些包有更新可用。但如果你不使用虚拟环境,最好不要在系统上运行这个工具,因为你的其他项目可能依赖于不同的版本(或者即使现在都能正常工作,更新后的版本也可能不兼容)。
根据提供的文档,使用起来很简单。pip-review
可以显示可用的更新,但不会自动安装它们。
$ pip-review
requests==0.13.4 available (you have 0.13.2)
redis==2.4.13 available (you have 2.4.9)
rq==0.3.2 available (you have 0.3.0)
如果你想要自动安装更新,这个工具也可以做到:$ pip-review --auto
。还有一个--interactive
选项,可以让你选择性地更新某些包。
完成这些后,pip-tools
提供了一种方法,可以用最新版本更新你的requirements.txt文件:pip-dump
。同样,这个操作是针对当前活动的环境,所以建议在虚拟环境中使用。
你可以通过pip install pip-tools
来安装这个项目。
作者的备注:我在小型Django项目中使用过这个工具,感觉非常不错。不过有一点,如果你在虚拟环境中安装了pip-tools
,当你运行pip-dump
时,它会被添加到你的requirements.txt文件中。因为我的项目比较小,我通常会手动删除那一行。如果你有某种构建脚本,可能需要在部署之前自动去掉它。
我刚发现一个专门为这个任务设计的Python包 - piprot,它的口号是:
How rotten are your requirements?
使用起来非常简单:
$ piprot requirements.txt
Django (1.5.1) is 315 days out of date. Latest is 1.6.2
lxml (3.0) is 542 days out of date. Latest is 3.3.4
Your requirements are 857 days out of date
你还可以把 pip freeze
的结果“传递”给 piprot
命令,这样它就可以检查你在沙箱/虚拟环境中安装的包有多过期:
pip freeze | piprot
希望这对将来某些人有帮助。
Pip自带了这个功能。假设你已经进入了你的虚拟环境,输入:
$ pip list --outdated
psycopg2 (Current: 2.5.1 Latest: 2.5.2)
requests (Current: 2.2.0 Latest: 2.2.1)
$ pip install -U psycopg2 requests
之后,新的psycopg2和requests版本就会被下载并安装。然后:
$ pip freeze > requirements.txt
这样就完成了。虽然这不是一个命令,但好处是你不需要任何外部依赖。