【问题标题】: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 也可以提出同样的问题。

【问题讨论】:

标签: python pip dependencies conda requirements.txt


【解决方案1】:

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

  1. pipenv 使用 Pipfile and Pipfile.lock 与您描述类似 JavaScript 文件的方式类似。 pipenv 是一个比 pip“更大”的工具,因为它还创建和管理 virtualenvs。

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

  2. poetry 使用 pyproject.toml and poetry.lock files,也类似于您描述 JavaScript 文件的方式。

  3. 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 安装到新环境中。
猜你喜欢
  • 1970-01-01
  • 2020-09-24
  • 2017-12-16
  • 2018-10-06
  • 2019-09-05
  • 2022-08-15
  • 2018-12-14
  • 2018-07-05
  • 2020-01-19
相关资源
最近更新 更多