JavaScript
的软件包管理器(如npm
和yarn
使用package.json
指定“顶级”依赖项,并创建lock-file进行跟踪结果安装的 all 软件包的特定版本(即顶级和子级别依赖项)。
此外,package.json
允许我们区分顶级依赖类型,例如 production 和 development 。
另一方面,对于Python
,我们有pip
。我想与pip
文件等效的lock
是pip freeze > requirements.txt
的结果。
但是,如果仅维护单个requirements.txt
文件,则很难区分顶级和子级依赖项(例如,您需要pipdeptree -r
来找出这些依赖项)。如果您想删除或更改顶级依赖项,这将是一个巨大的痛苦,因为很容易留下孤立的软件包(据我所知,{{1}时pip
does not remove sub-dependencies }}一个程序包。
现在,我想知道:是否存在一些约定来处理这些pip uninstall
文件的不同类型,并使用requirements
来区分顶级和子级别的依赖项?
例如,我可以想象有一个pip
,其中仅包含生产环境的顶级要求,即requirements-prod.txt
和package.json
的(简化的)等效项,其中包含requirements-prod.lock
的输出,并作为我的pip freeze
文件。另外,我可以为开发依赖项创建一个lock
,依此类推。
我想知道这是不是要走的路,或者是否有更好的方法。
p.s。对于requirements-dev.txt
的{{1}},可能会问相同的问题。
答案 0 :(得分:3)
今天至少有两个不错的选择:
pipenv
使用Pipfile
and Pipfile.lock
类似于描述相似的JavaScript文件的方式。与pipenv
相比,pip
是“更大”的工具,从某种意义上说,它还可以创建和管理虚拟环境。
这可能是当今最流行的选项,并且几乎可以肯定,它将在许多开发人员的工作流程中取代pip
。
pip-tools
提供了pip-compile
和pip-sync
命令。在这里,requirements.in
列出了您的直接依赖关系,通常具有宽松的版本限制,并且pip-compile
从您的requirements.txt
文件中生成锁定的.in
文件。
我个人喜欢这个工具,因为它是向后兼容的(生成的requirements.txt
可以由pip
处理),并且pip-sync
工具可以确保virtualenv与锁定版本完全匹配,删除“锁定”文件中没有的内容。