Python 使用本地依赖关系构建具有诗意的可安装tar.gz/whl

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

在我的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…
使用诗意和本地依赖关系构建
mypackage
,以便能够安装
mypackage
只需使用简单的
pip install mypackage-0.1.0.tar.gz
命令,而无需任何其他文件。我曾尝试在
pyproject.toml
中使用
path
file
说明符,但不断出现以下错误:

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

my
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的用例与您需要的不同,因此它无法解决您的问题

从这些文档中的使用示例中,您可以看到路径指向不属于包本身的包,它们总是先离开根,如下所示:
。/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机器上安装结果包。我正在看的东西