我正在阅读文档而无法绕过它:
约束文件是需求文件,仅控制安装了哪个版本的需求,而不是是否已安装.它们的语法和内容几乎与要求文件相同.
有一个关键区别:在约束文件中包含一个包不会触发包的安装.
那么这是否意味着我需要首先要求文件然后运行约束?
需要同时有requirements.txt和constraints.txt?
还是只是-c requirements.txt
?
有人可以用简单的英语解释新的PIP功能:约束文件吗?
我认为约束文件是将"真实"要求与完整安装列表分开的好方法.
在您的需求文件中完全指定包版本是一种很好的做法.例如,如果您使用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年内停止需要另一个包裹,则全新安装将停止安装.
我认为这个以及一些注释是一种有用的方式来传达您正在使用的项目包,以及包含哪些包,因为它们是依赖项.
我认为如果你使用pip 8.x的散列检查模式会变得更有用,这需要指定依赖项依赖项的版本.如果你走这条路,我建议使用hashin来帮助你管理哈希.有关使用约束和散列的复杂需求设置,请参阅browsercompat.