Python 使用本地依赖关系构建具有诗意的可安装tar.gz/whl
在我的python项目中有以下结构:Python 使用本地依赖关系构建具有诗意的可安装tar.gz/whl,python,python-3.x,pip,python-poetry,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/lib/local
├───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…
使用诗意和本地依赖关系构建mypackage
,以便能够安装mypackage
只需使用简单的pip install mypackage-0.1.0.tar.gz
命令,而无需任何其他文件。我曾尝试在pyproject.toml
中使用path
和file
说明符,但不断出现以下错误:
错误:找不到满足localdep要求的版本(从mypackage==0.1.0)(从版本:无)
mypyproject.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的用例与您需要的不同,因此它无法解决您的问题
从这些文档中的使用示例中,您可以看到路径指向不属于包本身的包,它们总是先离开根,如下所示:。/some/different/location
。整个构造只在开发期间有用,其逻辑将与poetry install
一起运行,而不是poetry build
您希望将本地依赖项与项目捆绑在一起,以便pip
在部署项目的.whl
时知道从何处提取本地依赖项。但是由于pyproject.toml
没有与轮子元数据打包在一起,因此从何处获取依赖项的信息不再可用,因此它无法工作。一个构建的包只知道它有哪些依赖项,而不知道从哪里获取它们。从其他语言来看,将所有依赖项与代码捆绑在一起可能有点不寻常
因此,即使您能够将包构建为包含另一个控制盘(默认情况下不起作用),因为默认情况下,setuptools
在sdist/bdist中只包含.py
文件,pip
也无法知道依赖关系是可访问的。
我看到四个选项可以用python支持的方式解决您的问题
使用打开的localdep
版本,或将其上载到该版本。但如果有可能的话,你可能不会问这个问题
如果localdep
在您的控制下,并且仅由mypackage
使用,则将其编写为mypackage
的一个简单子模块,而不是-read,最初决定使用localdep
自己的包是过度工程化的,这可能是真的,也可能不是真的
使用python理解的方式访问供应商localdep
。对于所有的考虑和陷阱,或者如果你想让它工作而不需要真正理解为什么或如何工作,请进行深入的解释
将您的包部署为“舵手室”
什么是驾驶室?
驾驶室部分需要多一点文字,但可能最接近您最初的想法。在这种方法中,您不需要在项目中包含localdep
,最好删除整个mypackage/lib
文件夹localdep
只需要安装到python解释器中,您可以通过运行pip freeze
并检查localdep的
名称和版本的输出来确保这一点
相同的输出将用于使用pip wheel-w wheelhouse$(pip freeze)
构建所述驾驶室。如果您不想包含开发依赖项,请在使用install运行wheel命令之前设置并输入它;诗歌外壳
为了完整性起见,您可以使用poetry build
构建dist/myproject.whl
,并将其扔到那里,然后您只需使用这个舵手室,通过运行python-m pip install wheelhouse/*
任意一个python
即可将您的软件包安装到任何地方
为什么要用pip而不是诗歌呢?
Poethy是一个用于开发包的依赖关系管理器,因此它不会处理太多的部署问题,只会将它们作为次要目标。这通常是好的,因为正如我们所看到的,pip在这方面非常有能力pip
在开发过程中不是那么方便,这就是为什么poetry很好,但poetry并不能完全取代pip
如果我以与您相同的方式设置两个项目,那么我无法复制您的bug,因为它会正常工作。我看到的唯一问题是包的路径是myproject/lib/…
,而它应该是mypackage/lib/…
。有可能是这个问题吗?@Arne不幸的是,这里输入错误,所以不是这样。该问题发生在使用诗意构建mypackage
后,使用pip
安装mypackage
的过程中。因此,pip似乎在pypi中搜索这个包,而不是从本地使用它。因此,据我所知,您的构建和安装工作顺利,不会产生任何错误?我明白了,我最初误解了这个问题。在这里写一个答案会有点困难,因为在python中,将包相互捆绑在一起是不寻常的。在少数情况下,由于依赖关系完全不可用而需要执行此操作,请直接包含源文件并将其作为子模块处理。谢谢您的回答,我非常感谢。是的,wheelhouse似乎非常接近我想要达到的目标——它基于当前的操作系统/设备设置创建轮子,同时我对创建一种独立于操作系统的解决方案非常感兴趣——所以我可以在任何macOS/Win/Linux机器上安装结果包。我正在看的东西