检查需求是否是最新的

我正在使用pip 需求文件保持我的依赖列表。

我也尝试遵循pipe理依赖关系的最佳实践,并在需求文件中提供精确的包版本。 例如:

 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 ,但它说,所有是最新的:

 $ pip install --upgrade -r requirements.txt Requirement already up-to-date: Django==1.5.1 ... 

请注意,在这一点上,我不想运行实际的升级 – 我只是想看看是否有任何更新可用。

Pip有内置的这个function。 假设你在你的virtualenvtypes中:

 $ 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和请求将被下载并安装。 然后:

 $ pip freeze > requirements.txt 

你完成了。 这不是一个命令,但优点是你不需要任何外部依赖。

刚刚find一个专门为这个任务而devise的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 

你也可以“pipe道” pip freezepiprot命令,所以它实际上可以检查你的沙盒/虚拟环境中安装的软件包有多烂:

 pip freeze | piprot 

希望将来有助于某人。

既然你提到你喜欢遵循最佳实践,我猜你也在使用virtualenv,对吗? 假设情况是这样的,既然你已经固定你的包,有一个工具称为pip工具 ,你可以运行你的virtualenv来检查更新。

有一个缺点,为什么我提到使用virtualenv虽然。

[工具]检查PyPI并报告可用的更新。 它使用当前安装的软件包列表来检查更新, 它不使用任何requirements.txt

如果你在virtualenv中运行它,你可以很容易地看到哪些软件包有可用于当前活动环境的更新。 但是如果你不使用virtualenv,可能不是最好的,因为你的其他项目可能依赖于不同的版本(或者即使它们全部工作,也可能不适用于更新的版本)。

从提供的文档,使用很简单。 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开关,您可以用来select性地更新软件包。

一旦完成了这一切, pip-tools提供了一种方法来更新您的requirements.txt与最新版本: pip-dump 。 同样,这是针对当前活动的环境运行的,因此build议在virtualenv中使用。

项目的安装可以通过pip install pip-tools

作者注:我已经使用这个小Django项目,并非常高兴。 但是请注意,如果您将pip-tools安装到您的虚拟环境中,那么当您运行pip-dump您会发现它会被添加到您的requirements.txt文件中。 由于我的项目很小,我一直只是手动删除该行。 如果您有某种构build脚本,则可能需要在部署之前自动剥离它。

你可以简单地在你的env(虚拟或非虚拟)中做这样的事情:

 pip freeze | cut -d = -f 1 | xargs -n 1 pip search | grep -B2 'LATEST:'