使用本地依赖项构建可安装的 tar.gz/whl with poetry

Building installable tar.gz/whl with poetry using local dependency

我的 python 项目中有以下结构:

├───pyproject.toml
└───mypackage
    │
    ├───lib
    │       localdep-0.2.0-py3-none-any.whl
    │       localdep-0.2.0.tar.gz
    └───service
            app.py
            home.py
            modules.py

我需要使用 mypackage/lib/localdep-0.2.0... 中的诗歌和本地依赖项 localdep 来构建 mypackage 以便能够安装 mypackage 只需使用简单的 pip install mypackage-0.1.0.tar.gz 命令即可任何附加文件。我尝试在 pyproject.toml 中使用 pathfile 说明符,但是我不断收到以下错误:

ERROR: Could not find a version that satisfies the requirement localdep(from mypackage==0.1.0) (from versions: none)

我的当前版本 pyproject.toml:

[build-system]
requires = [ "poetry>=0.12",]
build-backend = "poetry.masonry.api"

[tool.poetry]
name = "myproject"
version = "0.1.0"
description = "Simple demo project."
authors = ["Some Author"]
license = "MPL 2.0"

[tool.poetry.dependencies]
python = "3.7.3"
localdep = {file = "mypackage/lib/localdep-0.2.0-py3-none-any.whl"}

有谁知道如何将本地依赖项传递给 pyproject.toml 以便 poetry build 能够以正确的方式打包它?

poetry的local dependency syntax用例和你需要的不一样,这里不能解决你的问题

从这些文档中的用法示例可以看出,路径指向的包不是包本身的一部分,它们总是先离开根,就像这样:../some/different/location。整个构造仅在开发期间有用,其逻辑将是 运行 和 poetry install,而不是 poetry build.

想要的是将本地依赖项与你的项目捆绑在一起,这样 pip 就会知道在部署你的项目 .whl 的过程中从中拉取本地依赖项。但是由于 pyproject.toml 没有与 wheel 元数据一起打包,从哪里获取依赖项的信息不再可用,因此它无法工作。构建的包只知道它有哪些依赖项,而不知道从哪里获取它们。这种理念对于其他语言来说可能有点不寻常,在其他语言中将所有依赖项与您的代码捆绑在一起并不罕见。

因此,即使您能够构建包以包含另一个轮子,但默认情况下这不起作用,因为 setuptools 默认仅包含 sdist/bdist 中的 .py 个文件, pip 无法知道依赖关系是否可达。 我看到有四个选项可以以 python 支持的方式解决您的问题。

  1. 使用 pyPI 上的 localdep 版本,或将其上传到那里。但如果这是可能的话,你可能不会问这个问题。
  2. 如果localdep在你的控制之下并且只被mypackage使用,写成mypackage的一个简单的子模块——阅读,最初的决定localdep 它自己的包是过度设计的,这可能是真的,也可能不是。
  3. 使用供应商 localdep python 理解的方式。如果你想让它工作而不需要真正理解为什么或如何工作,请选择 for an in-depth explanation with all the considerations and pitfalls, or
  4. 将您的包部署为“驾驶室”。

什么是驾驶室?

驾驶室部分需要更多文字,但它可能最接近您最初的想法。在这种方法中,您不需要在项目中包含 localdep,最好删除整个 mypackage/lib 文件夹。 localdep 只需要安装到您的 python 解释器中,您可以通过 运行 宁 pip freeze 并检查 localdep's 名称和版本的输出来确保这一点。

然后将使用相同的输出与 pip wheel -w wheelhouse $(pip freeze) 一起建造所述驾驶室。如果您不想包含开发依赖项,delete your current virtualenv 并设置它并在 运行 再次使用 poetry install; poetry shell 执行 wheel 命令之前输入它。

为了完整起见,您可以使用 poetry build 构建 dist/myproject.whl 并将其也放入其中,然后您可以使用此驾驶室通过 [=80 在任何您喜欢的地方安装您的包=]宁 python -m pip install wheelhouse/* 随心所欲 python

为什么要使用 pip 而不是 poetry?

Poetry 是用于开发包的依赖管理器,因此它不会过多地处理部署问题,而只是切向地针对它们。这通常很好,因为正如我们所见,pip 在这方面非常有能力。 pip在开发的时候不是很方便,所以诗歌很好,但是诗歌并不能完全取代pip