使用本地依赖关系以诗歌构建可安装的tar.gz / whl

时间:2019-09-24 16:59:28

标签: python python-3.x pip python-poetry

我的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,而无需任何其他操作文件。我尝试在path中使用filepyproject.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能够以正确的方式打包它吗?

1 个答案:

答案 0 :(得分:1)

诗歌local dependency syntax的用例与您所需要的不同,因此无法在此处解决您的问题。

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

您想要的 是将本地依赖项与您的项目捆绑在一起,以便pip会在项目的.whl部署期间知道从何处提取本地依赖项。但是,由于pyproject.toml并未与转轮元数据打包在一起,因此不再提供获取依赖项的信息,因此无法使用。生成的程序包仅知道其具有哪些依赖项,而不知道从何处获取它们。这种哲学可能来自其他语言,这在所有语言中将所有依赖项与代码捆绑在一起并不罕见。

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

  1. 使用pyPI上的localdep版本,或将其上传到该版本。但是,如果有可能,您可能不会问这个问题。
  2. 如果localdep在您的控制之下,并且仅由mypackage使用,请将其写为mypackage的简单子模块-读取做出{{1} }自己的软件包过度设计,这可能是正确的,也可能不是正确的。
  3. 使用python可以理解的方式来供应商localdep。以this guide为基础,详细说明所有注意事项和陷阱,或者this hacky post,如果您希望在不真正了解其原因或方式的情况下使其正常工作。
  4. 将程序包部署为“驾驶室”。

什么是驾驶室?

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

然后将使用相同的输出用localdep's来构建所述操舵室。如果您不想包括开发人员依赖项,请先delete your current virtualenv进行设置并输入,然后再次使用pip wheel -w wheelhouse $(pip freeze)运行wheel命令。

出于完整性考虑,您可以使用poetry install; poetry shell来构建dist/myproject.whl并将其扔进去,然后只要运行{{1} }与您想要的任何poetry build

为什么要使用点子而不是诗歌?

Poetry是用于开发程序包的依赖项管理器,因此,它处理的部署问题不多,仅切向地针对它们。通常这样做很好,因为正如我们所见,python -m pip install wheelhouse/*在这方面非常有能力。 python在开发过程中并不那么方便,这就是为什么诗歌不错的原因,但是诗歌并不能完全取代pip