Poetry项目锁定文件和Docker容器安装

问题描述 投票:0回答:1

我有一个带有 Poetry 的 Python 项目,我想将其上传到 CodeArtifact(像任何其他 Python 存储库一样),然后将其安装到 Docker 容器中。我的 Python 项目在

pyproject.toml
中具有依赖项

[tool.poetry.dependencies]
pandas = "^2.1.4"
pytest-mock = "^3.12.0"

^
表示接受更高版本。但一旦我的项目开始工作,我也会有一个
poetry.lock
文件。这可以防止使用
poetry install
安装更高版本。 现在,当一切正常时,我运行
poetry build
并将库上传到 CodeArtifact。

如果我想将此库安装到 Docker 容器中,我可以运行

pip install
并指定我的库的版本。

我现在的问题是:

  • 此安装是否会尊重
    poetry.lock
    文件?或者它会安装最新的依赖项,例如
    pandas 2.2.0
  • 如何阻止较新的版本?这就是说:我必须将其从 pyproject.toml 文件中删除吗?或者必须将锁定文件复制到容器并运行
    poetry install
python docker pypi python-poetry aws-codeartifact
1个回答
1
投票

如果您已运行

poetry build
创建一个包并将该包上传到 codeartifact,则该包现在已准备好由包管理器(例如
pip install
poetry add
)安装,无论“调用者”是否在容器中。

使您的容器依赖项镜像您的本地项目

如果您想让依赖版本遵循

poetry.lock
并完全镜像本地项目中的依赖版本,您可以在容器中安装Poetry,从本地项目复制
poetry.lock
,然后在容器中安装poetry。

这里有一个示例(实际上有几个)这是如何完成的

依赖解析如何工作

Pip 和 Poetry 等依赖管理工具将查看项目中每个依赖项的

pyproject.toml
中指定的依赖项,将它们相互比较,并确定哪些依赖项版本将满足项目(和依赖项要求),而不会导致冲突。

在您的情况下,这意味着安装的 Pandas 版本将根据您的环境和项目中的其他依赖项而变化。

具体例子:

  • 您正在参与 Foo 项目。你做到了
    poetry build
    ,使 Foo 成为一个可安装的包
  • Foo 包中有一个
    pyproject.toml
    ,指定其依赖关系要求
  • 另一个项目:“Bar”现在通过 Poetry 或 Pip (等)安装 Foo。假设我们做到了
    pip install foo

行为如下:

  • Pip 查看 Bar 的每个依赖包(以及它们的子依赖包)中的 pyproject.toml 文件
  • Pip 确定每个子依赖项可以安装的“最大版本”,并且仍然:
    1. 满足所有套餐要求
    2. 不产生冲突
这些依赖项管理器非常“聪明”,因为它们只会升级依赖项支持的高度。

例如:

    您安装依赖于
  • bar
     的软件包 
    mydep = <=2.0.5
  • 现在安装依赖于
  • qux
     的软件包 
    mydep = <=2.1.0
  • Mydep 将被安装,但仅限于版本 2.0.5。
如何防止更高版本

重要提示:Pip 和 Poetry 尊重语义版本控制。语义版本控制突出显示了对库的重大更改(公共 API 的更改等),因此依赖项管理器知道“他们可以升级到什么程度”,而不会破坏您的代码。 不建议手动编辑版本要求 - 这就是像 Poetry 这样的依赖管理器的用途!

现在有了这个警告,您可以在需求文件中使用“小于或等于”符号来“锁定”特定版本的依赖项或设置上限。例如。

mydep = <=2.0.5

 将不高于 2.0.5,而 
mydep = =2.0.5
 将恰好为 2.0.5。

© www.soinside.com 2019 - 2024. All rights reserved.