避免python中的依赖性混淆
在我工作场所的python项目中,我们使用标准的需求文件安装了一些PyPI的软件包,以及一些Gemfury的私人公司软件包 阅读本文后: 我们的需求文件类似于:避免python中的依赖性混淆,python,pip,dependencies,gem-fury,Python,Pip,Dependencies,Gem Fury,在我工作场所的python项目中,我们使用标准的需求文件安装了一些PyPI的软件包,以及一些Gemfury的私人公司软件包 阅读本文后: 我们的需求文件类似于: --index-url <OUR_GEMFURY_URL> --extra-index-url https://pypi.python.org/simple aiohttp==3.7.1 simplejson==3.17.1 <our-package>==1.0.0 <our-other-package
--index-url <OUR_GEMFURY_URL>
--extra-index-url https://pypi.python.org/simple
aiohttp==3.7.1
simplejson==3.17.1
<our-package>==1.0.0
<our-other-package>==1.2.0
——索引url
--额外索引urlhttps://pypi.python.org/simple
aiohttp==3.7.1
simplejson==3.17.1
==1.0.0
==1.2.0
我试着阅读一些pip的文档,但我无法完全理解它是如何选择从哪里下载软件包的。
例如,如果有人将恶意版本1.0.0上载到pypi prod,会发生什么情况?pip如何知道要获取哪一个包?
是否有一种方法可以指定特定包的topip,以便只在--index url中搜索它
如何防止代码中的依赖项混淆?
谢谢你的帮助 文章提到了pip使用的算法:
- 检查指定(内部)包上是否存在库 索引
- 检查公共包索引(PyPI)上是否存在库
- 安装找到的任何版本。如果两者上都存在该包,则默认从版本号较高的源安装
=1.2.0
,那么如果它的版本高于您打算安装的版本,您可以从公共pypi服务器获得一些mailicios包
文章中提到的简单解决方案是删除——额外的索引url
如果包1.0
是内部或外部包,并且存在于私有pypi服务器中,则将从那里下载
外部软件包将通过内部pypi服务器从公共pypi服务器下载,内部pypi服务器将缓存这些软件包以备将来使用
我还建议在requirements.txt中有明确的版本,这样您就可以知道您得到的版本,并通过增加版本进行有意识的升级
总结这些指南(这些指南并非详尽无遗,并防止出现所有可能的安全漏洞)
- 删除
来自--额外索引urlhttps://pypi.python.org/simple
,pip.conf
和自动化脚本requirements.txt
- 在requirements.txt中指定内部和外部包的显式版本