我的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
中使用file
和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
能够以正确的方式打包它吗?
答案 0 :(得分:1)
诗歌local dependency syntax的用例与您所需要的不同,因此无法在此处解决您的问题。
从这些文档中的用法示例中,您可以看到路径指向不属于软件包本身的软件包,它们始终首先离开根目录,例如:../some/different/location
。整个构造仅在开发期间有用,其逻辑将使用poetry install
而不是poetry build
运行。
您想要的 是将本地依赖项与您的项目捆绑在一起,以便pip
会在项目的.whl
部署期间知道从何处提取本地依赖项。但是,由于pyproject.toml
并未与转轮元数据打包在一起,因此不再提供获取依赖项的信息,因此无法使用。生成的程序包仅知道其具有哪些依赖项,而不知道从何处获取它们。这种哲学可能来自其他语言,这在所有语言中将所有依赖项与代码捆绑在一起并不罕见。
因此,即使您能够构建包以包含另一个轮子,该轮子在默认情况下也不起作用,因为setuptools
默认仅在sdist / bdist中包括.py
个文件,因此没有pip
知道依赖关系可以到达的方式。
我看到了四个选项来以python支持的方式解决您的问题。
localdep
版本,或将其上传到该版本。但是,如果有可能,您可能不会问这个问题。localdep
在您的控制之下,并且仅由mypackage
使用,请将其写为mypackage
的简单子模块-读取做出{{1} }自己的软件包过度设计,这可能是正确的,也可能不是正确的。localdep
。以this guide为基础,详细说明所有注意事项和陷阱,或者this hacky post,如果您希望在不真正了解其原因或方式的情况下使其正常工作。驾驶室部分需要更多文本,但可能与您最初想到的内容最接近。通过这种方法,您不需要在项目中包括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
。