等同于`pip`的package.json和package-lock.json

时间:2018-10-05 12:25:21

标签: python pip dependencies conda requirements.txt

JavaScript的软件包管理器(如npmyarn使用package.json指定“顶级”依赖项,并创建lock-file进行跟踪结果安装的 all 软件包的特定版本(即顶级子级别依赖项)。

此外,package.json允许我们区分顶级依赖类型,例如 production development

另一方面,对于Python,我们有pip。我想与pip文件等效的lockpip freeze > requirements.txt的结果。

但是,如果仅维护单个requirements.txt文件,则很难区分顶级和子级依赖项(例如,您需要pipdeptree -r来找出这些依赖项)。如果您想删除或更改顶级依赖项,这将是一个巨大的痛苦,因为很容易留下孤立的软件包(据我所知,{{1}时pip does not remove sub-dependencies }}一个程序包。

现在,我想知道:是否存在一些约定来处理这些pip uninstall文件的不同类型,并使用requirements来区分顶级和子级别的依赖项?

例如,我可以想象有一个pip,其中仅包含生产环境的顶级要求,即requirements-prod.txtpackage.json的(简化的)等效项,其中包含requirements-prod.lock的输出,并作为我的pip freeze文件。另外,我可以为开发依赖项创建一个lock,依此类推。

我想知道这是不是要走的路,或者是否有更好的方法。

p.s。对于requirements-dev.txt的{​​{1}},可能会问相同的问题。

1 个答案:

答案 0 :(得分:3)

今天至少有两个不错的选择:

  1. pipenv使用Pipfile and Pipfile.lock类似于描述相似的JavaScript文件的方式。与pipenv相比,pip是“更大”的工具,从某种意义上说,它还可以创建和管理虚拟环境。

    这可能是当今最流行的选项,并且几乎可以肯定,它将在许多开发人员的工作流程中取代pip

  2. pip-tools提供了pip-compilepip-sync命令。在这里,requirements.in列出了您的直接依赖关系,通常具有宽松的版本限制,并且pip-compile从您的requirements.txt文件中生成锁定的.in文件。

    我个人喜欢这个工具,因为它是向后兼容的(生成的requirements.txt可以由pip处理),并且pip-sync工具可以确保virtualenv与锁定版本完全匹配,删除“锁定”文件中没有的内容。