poetry update --lock
和poetry lock
的区别是什么?我没能在官方文档中找到很多有用的提示,我知道两者都不一样,因为我们最近不得不从poetry update --lock
切换到poetry lock
升级软件包,因为意想不到的问题。
总结:你不再更新poetry.lock
文件中的包了。
poetry lock
创建poetry.lock
文件,但不安装软件包。
(poetry lock --help
description):
lock命令读取pyproject。从当前目录中取出Toml文件,对其进行处理,并锁定诗歌中的依赖项。锁定文件。
"Processing"意味着将依赖项解析为兼容(默认情况下,与最新版本兼容)。poetry lock
不安装包,它只生成一个poetry.lock
文件。
假设我有一个包A,它有子依赖项b。
poetry lock
解析pyproject.toml
文件中的所有依赖项及其子依赖项。- 默认情况下,它将尝试更新所有子依赖版本。所以它会尝试更新最新版本的A和最新版本的b。
--no-update
将阻止任何更新。相反,Poetry将专注于使pyproject.toml
版本兼容,但将使用与pyproject.toml
中现有版本兼容的任何版本。这意味着即使包A与包B的最新版本兼容,它也不会更新包B,它只会确保使用一些兼容的包B。
poetry update
也更新包版本,然后安装更新。
- 解析依赖项以相互兼容,就像
poetry lock
- 创建或更新
poetry.lock
,如poetry lock
-
包,这是不同的。文档没有明确提到这一点,但您可以从
--lock
标志的描述中推断,它不执行安装,而只是更新poetry.lock
从上面链接的文档:
——lock: Do not perform install (onlyupdate)lockfile)。
注意,更新不仅安装了一个新包,而且也更新了几包。
$ 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
。在您的情况下,可能有一些软件包无法更新,因为该版本被显式地使用,升级将导致某些东西以难以修复的方式中断。
当没有其他参数调用时,它们做同样的事情。
如果您检查源代码,您将看到它们最终都调用相同的函数(def run
)来更新锁文件。在此之前,它们都使用参数False
调用def execute_operations
,以避免实际安装任何东西。
的区别唯一不同的是调用这些命令时可以传递的其他选项。这些会影响你想要做的事情。你可以在文档中看到这些额外的选项。
poetry lock
:--no-update
(源代码)poetry update --lock
:packages --without --with --only --dry-run
(源代码)
因此,例如,您可以创建/更新锁文件,而无需更新以前固定在pyproject.toml
中的任何包,也可以将poetry.lock
中的任何固定版本更新为最新版本,仅使用以下命令:
poetry lock --no-update
类似地,您可以仅在锁文件中更新特定的包版本。使用以下命令:
poetry update [package] --lock
poetry lock --no-update
poetry update [package] --lock
或者您可以通过仅在dry-run
模式下运行来测试锁文件更新使用以下命令:
poetry update --lock --dry-run
您可能还认为可以使用以下命令来更新锁文件的dev依赖项:
poetry update --lock --only=dev
但是从1.6开始,不管什么原因,这都不起作用了