问题:等价于package.json' and package-lock.jsonforpip`

JavaScript的包管理器如npmyarn使用package.json来指定“顶级”依赖项,并创建一个锁定文件以跟踪_all_包的特定版本(即顶级_和_子级依赖项)结果安装。

另外,package.json允许我们区分顶级依赖的类型,比如_production_和_development_。

另一方面,对于Python,我们有pip。我想pip等效于lock-file 将是pip freeze > requirements.txt的结果。

但是,如果您只维护这个单一的requirements.txt文件,则很难区分顶级和子级别的依赖关系(您需要例如pipdeptree -r来弄清楚这些)。如果您想删除或更改顶级依赖项,这可能会很痛苦,因为很容易留下孤立的包(据我所知,pip不会删除子依赖项当您使用pip uninstall包时)。

现在,我想知道:是否有一些约定来处理这些requirements文件的不同类型以及用pip区分顶级和子级依赖关系?

例如,我可以想象有一个requirements-prod.txt,它只包含生产环境的顶层需求,作为package.json的(简化)等价物,还有一个requirements-prod.lock,它包含pip freeze的输出,并充当我的lock-file .此外,我可以有一个requirements-dev.txt用于开发依赖项,依此类推。

我想知道这是要走的路,还是有更好的方法。

p.s.对于condaenvironment.yml也可以提出同样的问题。

解答

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

1.Poetry使用pyproject.tomlpoetry.lock文件,与package.json和锁定文件在 JavaScript 世界中的工作方式非常相似。

现在这是我的首选解决方案。

2.Pipenv使用PipfilePipfile.lock,也很像你描述的JavaScript文件。

Poetry 和 Pipenv 都不仅仅是依赖管理。开箱即用,他们还为您的项目创建和维护虚拟环境。

3、pip-tools提供pip-compilepip-sync命令。在这里,requirements.in列出了您的直接依赖项,通常带有松散的版本约束,并且pip-compile从您的.in文件中生成锁定的requirements.txt文件。

这曾经是我的首选解决方案。它是向后兼容的(生成的requirements.txt可以由pip处理),并且pip-sync工具可确保 virtualenv 与锁定的版本完全匹配,从而删除不在“锁定”文件中的内容。

Logo

Python社区为您提供最前沿的新闻资讯和知识内容

更多推荐