`poetry lock` 和 `poetry update --lock` 有什么区别?

19

poetry update --lockpoetry lock有什么区别?我在官方文档中没有找到太多有用的提示,我知道两者不同,因为最近我们不得不从poetry update --lock切换到poetry lock来升级软件包,因为出现了意外问题。


那么使用Poetry安装软件包肯定存在问题。 - Dave Liu
2个回答

17
摘要:你不再更新poetry.lock文件中的软件包了。

poetry lock创建一个poetry.lock文件,但不安装包。

(poetry lock --help描述):

lock命令从当前目录读取pyproject.toml文件,进行处理,并将依赖项锁定在poetry.lock文件中。

"处理"意味着解决依赖项以保持兼容性(默认情况下与最新版本兼容)。poetry lock不会安装软件包,只会生成一个poetry.lock文件。

  1. poetry lock 解析 pyproject.toml 文件中的所有依赖项及其子依赖项。
  2. 默认情况下,它将尝试更新所有子依赖项的版本。因此,它会尝试更新 A 的最新版本和 B 的最新版本。
  3. --no-update 将阻止任何更新。相反,Poetry 将专注于使 pyproject.toml 中的版本兼容,并使用与 pyproject.toml 中当前存在版本兼容的任何版本。这意味着即使包 A 与包 B 的最新版本兼容,它也不会更新包 B,只会确保使用某个兼容的包 B。

诗歌更新还会更新软件包版本,然后安装更新。

  1. 解决依赖关系以相互兼容,就像诗歌锁定一样
  2. 创建或更新poetry.lock,就像诗歌锁定一样
  3. 安装软件包,这是不同的。文档没有明确提到这一点,但你可以从--lock标志的描述中推断出来,它不执行安装,只是更新poetry.lock

来自上面链接的文档:

--lock:不执行安装(仅更新锁文件)。

注意,更新不仅安装新软件包,还会更新多个软件包。

$ poetry update
Updating dependencies
Resolving dependencies... (106.7s)

Writing lock file

Package operations: 1 install, 39 updates, 0 removals

等一下,但那基本上听起来就像是 `poetry install`!
差不多。`poetry install` 是懒惰地安装,也就是说:
- 如果存在 `poetry.lock` 文件,它只会安装锁定文件中指定的包。 - 如果不存在 `poetry.lock` 文件,它会像 `poetry update` 一样尝试解决 `pyproject.toml` 中的依赖关系,创建一个 `poetry.lock` 文件,然后再安装它们。
因此,如果没有 `poetry.lock` 文件,`poetry install` 和 `poetry update` 是一样的。如果你不想更新依赖关系,直接从 `poetry.lock` 文件安装会更方便一些。
我的经验是:除非你有非常特殊的情况,否则只需使用poetry update即可。在你的情况下,可能有一些包无法更新,因为该版本被明确使用,并且升级可能会导致某些难以修复的问题。

4
你的 TLDR 对我来说非常令人困惑。 - Akaisteph7
TLDR代表“太长了,没看”这是一种说“这是摘要”的方式,但因为对许多人来说这不常见,所以我在我的帖子中将其删除了。 - Dave Liu
1
问题绝对不是字面上的TLDR。它是实际的"摘要"。我之前发表的评论已经过去一段时间了,但再次看到你的"摘要"时,它并没有概括你的实际答案,反而让我更加困惑你的意思。 - Akaisteph7
我觉得这个总结问题的方式很恰当,但是我很高兴看到你提供了一个用不同措辞的解释,似乎更加简明扼要。希望其他对我的解释感到困惑的人可以参考你的解释。 - Dave Liu

3

当没有其他参数调用时,它们做同样的事情。

如果您检查源代码,您会发现它们都最终调用相同的函数(def run)来更新锁定文件。在那之前,它们都使用参数False调用def execute_operations,以避免实际安装任何内容。

不同之处

唯一不同的是在调用这些命令时可以传递哪些其他选项。这些可以影响您要做的事情。您可以在文档中查看这些额外选项。

  • 诗歌锁定: --no-update源代码
  • poetry update --lockpackages --without --with --only --dry-run源代码

例子

例如,您可以使用以下命令创建/更新锁定文件,而不更新 pyproject.toml 中先前固定的任何软件包或将 poetry.lock 中固定版本的任何固定版本仅更新到其最新版本:

poetry lock --no-update

同样地,您可以通过使用以下命令仅更新锁定文件中的特定软件包版本:
poetry update [package] --lock

或者您可以通过使用以下命令以dry-run模式运行锁定文件更新来进行测试:

poetry update --lock --dry-run

你可能还以为只需使用以下命令就可以更新锁定文件的开发依赖项:
poetry update --lock --only=dev

但是从1.6版本开始,由于某种原因,这个方法就不起作用了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接