更新: pip 20.3,于 2020 年 11 月 30 日发布,引入了 a new resolver,修复了一些设计问题。它还重新实现了the constraints feature。现在很难或不可能按照我在下面描述的方式使用该功能。我不明白新的约束实现,我不再使用它。我从pip-tools 获得了pip-compile 的成功。我在requirements.in 中指定了顶级需求,pip-compile 生成一个带有特定版本的requirements.txt 一个包哈希。有关工作示例,请参阅 ichnaea 项目中的 requirements.in 和 requirements.txt。
以下原始答案,适用于 pip 20.2 及之前的版本
我认为约束文件是将“真实”需求与完整安装列表分开的好方法。
good practice 在您的需求文件中完全指定包版本。例如,如果您使用 Django LTS 安装 django-allauth,请将其固定到最新版本(根据我的回答):
Django==1.8.12
django-allauth==0.25.2
当您安装软件包时,它最终也会安装一些必需的软件包。因此,您也可以添加这些,以便每个人都获得相同版本的包:
Django==1.8.12
django-allauth==0.25.2
oauthlib==1.0.3
python-openid==2.2.5
requests==2.9.1
requests-oauthlib==0.6.1
然后您会收到错误报告“在 Python 3 下不起作用”。糟糕,python-openid 仅适用于 Python 2,而使用了python3-openid,进一步需要defusedxml:
Django==1.8.12
django-allauth==0.25.2
oauthlib==1.0.3
python-openid==2.2.5 ; python_version < '3.0'
python3-openid==3.0.10 ; python_version >= '3.0'
defusedxml==0.4.1 ; python_version >= '3.0'
requests==2.9.1
requests-oauthlib==0.6.1
现在 requirements.txt 越来越难看,乱七八糟的很难看到 Django 和 django-allauth 的“需求”。
这是一个引用约束文件的requirements.txt:
-c constraints.txt
Django==1.8.12
django-allauth==0.25.2
还有constraints.txt 提供有用的评论:
# django-allauth requirements
oauthlib==1.0.3
python-openid==2.2.5
python3-openid==3.0.10
defusedxml==0.4.1
requests==2.9.1
requests-oauthlib==0.6.1
不需要 Python 分类器,因为只有在包需要约束时才会安装约束,否则会被忽略。此外,如果一个软件包在 2 年后不再需要另一个软件包,那么全新安装将停止安装它。
我认为,加上一些 cmets,这是一种有用的方式来传达您正在为项目使用哪些包,以及包含哪些包,因为它们是依赖项。
如果您使用 pip 8.x 的 hash-checking mode,我认为它会变得更加有用,这需要指定依赖关系的版本。如果你走这条路,我推荐hashin 来帮助你管理哈希。请参阅browsercompat,了解使用约束和散列的复杂需求设置。