2

我的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使用诗歌和本地依赖项localdep来构建,mypackage/lib/localdep-0.2.0...以便能够mypackage仅使用简单的pip install mypackage-0.1.0.tar.gz命令进行安装,而无需任何其他文件。我尝试在其中使用pathfile说明符,pyproject.toml但是我不断收到以下错误:

错误:找不到满足 localdep 要求的版本(来自 mypackage==0.1.0)(来自版本:无)

我的当前版本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能够以正确的方式打包它?

4

1 回答 1

2

诗歌的本地依赖语法的用例与你需要的不同,所以这里不能解决你的问题。

从这些文档中的使用示例中,您可以看到路径指向不属于包本身的包,它们总是首先离开根,如下所示../some/different/location:整个构造仅在开发期间有用,其逻辑将使用 运行poetry install,而不是运行poetry build

想要的是将本地依赖项与您的项目捆绑在一起,以便pip在部署项目期间知道.whl从哪里提取本地依赖项。但是由于pyproject.toml没有和轮子元数据一起打包,所以从哪里获取依赖项的信息不再可用,所以它不能工作。构建的包只知道它有哪些依赖项,而不知道从哪里获取它们。这种哲学可能有点不寻常,来自其他语言,在这些语言中,将所有依赖项与代码捆绑在一起并不罕见。

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

  1. 使用您localdeppyPI上的版本,或将其上传到那里。但如果这是一种可能性,你可能不会问这个问题。
  2. 如果localdep在您的控制之下并且仅由 使用mypackage,则将其编写为一个简单的子模块,而不是 - 读取,制作自己的包mypackage的最初决定是过度工程,这可能是也可能不是真的。localdep
  3. 使用localdeppython 理解的供应商方式。阅读本指南以获得所有注意事项和陷阱的深入解释,或者如果您想让它工作而不需要真正理解为什么或如何工作,请阅读这篇 hacky post 。
  4. 将您的包部署为“操舵室”。

什么是驾驶室?

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

然后将使用相同的输出来构建所述操舵室pip wheel -w wheelhouse $(pip freeze)。如果您不想包含开发依赖项,请删除当前的 virtualenv并设置并输入它,然后poetry install; poetry shell再次运行 wheel 命令。

为了完整起见,您也可以使用它进行构建dist/myproject.whl并将poetry build其放入其中,然后您可以使用这个操舵室通过运行python -m pip install wheelhouse/*任何python您想要的方式在任何您喜欢的地方安装您的包。

为什么要使用 pip 而不是诗歌呢?

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

于 2019-09-25T07:09:57.240 回答