相当于 `pip` 的 `package.json' 和 `package-lock.json`
Posted
技术标签:
【中文标题】相当于 `pip` 的 `package.json\' 和 `package-lock.json`【英文标题】:Equivalent of `package.json' and `package-lock.json` for `pip`相当于 `pip` 的 `package.json' 和 `package-lock.json` 【发布时间】:2019-03-10 23:02:27 【问题描述】:javascript
的包管理器如 npm
和 yarn
使用 package.json
指定“***”依赖项,并创建 lock-file 以跟踪 all 作为结果安装的包(即***和子级依赖项)。
此外,package.json
允许我们区分***依赖项的类型,例如 production 和 development。
另一方面,对于Python
,我们有pip
。我想pip
等效于lock
-文件将是pip freeze > requirements.txt
的结果。
但是,如果您只维护这个单一的 requirements.txt
文件,则很难区分***和子级别的依赖关系(例如,您需要 pipdeptree -r
来弄清楚这些)。如果您想删除或更改***依赖项,这可能是一个真正的痛苦,因为很容易留下孤立的包(据我所知,pip
does not remove sub-dependencies 当你 pip uninstall
一个包时)。
现在,我想知道:是否有一些约定来处理这些requirements
文件的不同类型并使用pip
区分***和子级依赖关系?
例如,我可以想象有一个requirements-prod.txt
,它只包含生产环境的***需求,作为package.json
的(简化)等价物,还有一个requirements-prod.lock
,它包含@ 的输出987654343@,并充当我的lock
文件。此外,我可以有一个requirements-dev.txt
用于开发依赖项,依此类推。
我想知道这是要走的路,还是有更好的方法。
附言对于conda
的environment.yml
也可以提出同样的问题。
【问题讨论】:
另见***.com/q/58218592 【参考方案1】:今天至少有三个不错的选择:
pipenv
使用 Pipfile
and Pipfile.lock
与您描述类似 JavaScript 文件的方式类似。 pipenv
是一个比 pip
“更大”的工具,因为它还创建和管理 virtualenvs。
这可能是当今最流行的选项,并且几乎肯定会在许多开发人员的工作流程中取代 pip
。
poetry
使用 pyproject.toml
and poetry.lock
files,也类似于您描述 JavaScript 文件的方式。
pip-tools
提供pip-compile
和pip-sync
命令。在这里,requirements.in
列出了您的直接依赖项,通常带有松散的版本约束,pip-compile
从您的.in
文件中生成锁定的requirements.txt
文件。
就我个人而言,我喜欢这个工具,因为它向后兼容(生成的requirements.txt
可以由pip
处理)并且pip-sync
工具确保 virtualenv 与锁定的版本完全匹配,删除不匹配的东西在您的“锁定”文件中。
【讨论】:
感谢您的出色回答,它把我指向了this interesting post。但是,我对采用pipenv
犹豫不决,它使用virtualenv
而不是conda
,因为我真的很喜欢(并依赖)conda
管理Python
版本的能力。
这是支持pip-tools
,IMO 的另一点。它不会试图为你做太多。
而pip-tools
还负责“很容易留下孤立的包”,因为它会删除任何不在需求文件中的内容。
听起来不错,我去看看。确实引入了另一个依赖项。 ;-)
是的,解决pip
本身的限制。仅使用pip
有手动解决方法,但您更容易出错。 pip-compile
输出pip
-兼容requirements.txt
文件的事实意味着您可以在新机器上使用pip install -r requirements.txt
,然后继续使用pip-tools
。我通常在创建时将pip-tools
安装到新环境中。以上是关于相当于 `pip` 的 `package.json' 和 `package-lock.json`的主要内容,如果未能解决你的问题,请参考以下文章
pip 相当于 `npm install package --save-dev` 是啥?
package.json 与 package-lock.json 的关系