关于django:如何使用pip和需求文件升级特定包?

How can I upgrade specific packages using pip and a requirements file?

我在虚拟环境中为我的Django项目使用带有需求文件的PIP。我正在尝试升级一些包,尤其是Django本身,并且在源代码冲突方面遇到了一个错误:

1
Source in `<virtualenv`>/build/Django has version 1.2.3 that conflicts with Django==1.2.4 (from -r requirements/apps.txt (line 3))

在我的需求文件中将django的版本号从1.2.3更新到1.2.4之后。我正在使用此命令进行升级:

1
pip --install --upgrade -E `<virtualenv dir`> --requirement `<requirements file`>

我找不到任何触发整个包重新下载的标志。我甚至尝试先运行卸载命令,然后运行安装,但没有骰子。也许我错过了什么?


我运行了以下命令,它从1.2.3升级到1.4.0

1
pip install Django --upgrade

升级快捷方式:

1
pip install Django -U

注意:如果要升级的包有任何要求,此命令将另外将所有要求升级到可用的最新版本。在最新版本的PIP中,可以通过指定--upgrade-strategy only-if-needed来防止这种行为。使用该标志,除非依赖包的已安装版本不再满足已升级包的要求,否则将不会升级依赖项。


我不确定这是否是您的问题,但在我的情况下,我无法将django升级到1.2.4-我一直在完成1.2.3版本,所以我卸载django时使用了:

1
<virtualenv>/bin/pip uninstall Django

然后我删除了/build/Django目录,最后安装了正确的版本:

1
<virtualenv>/bin/pip install Django

希望这会有所帮助。


根据PIP文档示例3

1
pip install --upgrade django

但是根据我的经验,使用这种方法也可以升级与之相关的任何包。例子:

假设您要使用这种方法升级需要django >= 1.2.4somepackage,它也会将somepackagedjango升级到最新的更新。为了安全起见,请执行以下操作:

1
2
# assume you want to keep django 1.2.4
pip install --upgrade somepackage django==1.2.4

这样做将升级somepackage并使django保持为1.2.4版本。


--upgrade的快捷命令:

1
pip install Django --upgrade

是:

1
pip install Django -U


如果您只想升级一个名为somepackage的特定包,那么在最新版本的pip中应该使用的命令是

1
pip install --upgrade --upgrade-strategy only-if-needed somepackage

当您在Django中开发了一个应用程序时,这非常有用,该应用程序当前仅适用于特定版本的Django(例如django=1.9.x),并且希望使用bug修复/新功能升级某些依赖包,升级后的包取决于django(但适用于1.5之后的任何版本的django)。pip install --upgrade django-some-package的默认行为是将django升级到可用的最新版本,否则可能会破坏您的应用程序,不过使用--upgrade-strategy only-if-needed相关的包现在只能在必要时进行升级。


如果升级包,将卸载旧包。

这样做的一个方便方法是使用这个pip升级程序,它也会更新所选包(或所有包)的requirements.txt文件中的版本。

安装

1
pip install pip-upgrader

用法

激活virtualenv(这一点很重要,因为它还将在当前virtualenv中安装升级包的新版本)。

cd进入项目目录,然后运行:

1
pip-upgrade

高级用法

如果需求放置在非标准位置,则将其作为参数发送:

1
pip-upgrade path/to/requirements.txt

如果您已经知道要升级哪个包,只需将它们作为参数发送:

1
pip-upgrade -p django -p celery -p dateutil

如果需要升级到预发布/发布后版本,请在命令中添加--prerelease参数。

完全公开:我写了这个包裹。希望它有帮助。


通常,pip会在自己清理之后删除build目录的内容。唯一不这样做的时间是:

  • 您使用了--no-install选项
  • 您正在使用可编辑的包
  • 安装被取消或以其他方式中断。
  • 在所有其他情况下,您不应该拥有阻塞您的环境的build目录。