相当于 `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 的包管理器如 npmyarn 使用 package.json 指定“***”依赖项,并创建 lock-file 以跟踪 all 作为结果安装的包(即***子级依赖项)。

此外,package.json 允许我们区分***依赖项的类型,例如 productiondevelopment

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

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

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

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

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

附言对于condaenvironment.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-compilepip-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`的主要内容,如果未能解决你的问题,请参考以下文章

python pip命令安装相当于yum仓库

pip 相当于 `npm install package --save-dev` 是啥?

package.json 与 package-lock.json 的关系

node11---相册

package-lock.json 和 package.json 有啥区别,啥时候生成 package.json?

package.json和package-lock.json的区别