等价于`package.json' and `package-lock.json` for `pip`
问题:等价于package.json' and package-lock.jsonforpip`
JavaScript的包管理器如npm和yarn使用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.对于conda的environment.yml也可以提出同样的问题。
解答
今天至少有三个不错的选择:
1.Poetry使用pyproject.toml和poetry.lock文件,与package.json和锁定文件在 JavaScript 世界中的工作方式非常相似。
现在这是我的首选解决方案。
2.Pipenv使用Pipfile和Pipfile.lock,也很像你描述的JavaScript文件。
Poetry 和 Pipenv 都不仅仅是依赖管理。开箱即用,他们还为您的项目创建和维护虚拟环境。
3、pip-tools提供pip-compile和pip-sync命令。在这里,requirements.in列出了您的直接依赖项,通常带有松散的版本约束,并且pip-compile从您的.in文件中生成锁定的requirements.txt文件。
这曾经是我的首选解决方案。它是向后兼容的(生成的requirements.txt可以由pip处理),并且pip-sync工具可确保 virtualenv 与锁定的版本完全匹配,从而删除不在“锁定”文件中的内容。
更多推荐

所有评论(0)