Ali*_*ntu 6 python pip python-3.x python-poetry
我的Python项目中有以下结构:
\n\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80pyproject.toml\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80mypackage\n \xe2\x94\x82\n \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80lib\n \xe2\x94\x82 localdep-0.2.0-py3-none-any.whl\n \xe2\x94\x82 localdep-0.2.0.tar.gz\n \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80service\n app.py\n home.py\n modules.py\nRun Code Online (Sandbox Code Playgroud)\n\n我需要mypackage使用诗歌和本地依赖项进行构建localdep,以便mypackage/lib/localdep-0.2.0...能够mypackage仅使用简单的pip install mypackage-0.1.0.tar.gz命令进行安装,而无需任何其他文件。我尝试使用pathandfile说明符,pyproject.toml但不断收到以下错误:
\n\n\n错误:找不到满足 localdep 要求的版本(来自 mypackage==0.1.0)(来自版本:无)
\n
我的当前版本pyproject.toml:
[build-system]\nrequires = [ "poetry>=0.12",]\nbuild-backend = "poetry.masonry.api"\n\n[tool.poetry]\nname = "myproject"\nversion = "0.1.0"\ndescription = "Simple demo project."\nauthors = ["Some Author"]\nlicense = "MPL 2.0"\n\n[tool.poetry.dependencies]\npython = "3.7.3"\nlocaldep = {file = "mypackage/lib/localdep-0.2.0-py3-none-any.whl"}\nRun Code Online (Sandbox Code Playgroud)\n\n有谁知道如何传递本地依赖项,pyproject.toml以便poetry build能够以正确的方式打包它?
诗歌的本地依赖语法的用例与您需要的不同,因此它无法解决您的问题。
从这些文档中的使用示例中,您可以看到路径指向不属于包本身的包,它们总是首先保留根,如下所示:../some/different/location。整个构造仅在开发期间有用,其逻辑将使用 运行poetry install,而不是poetry build。
您想要的是将本地依赖项与您的项目捆绑在一起,以便pip在项目部署期间知道.whl从哪里提取本地依赖项。但由于pyproject.toml没有与轮元数据打包在一起,因此从何处获取依赖项的信息不再可用,因此它无法工作。构建的包只知道它有哪些依赖项,而不知道从哪里获取它们。这种哲学对于其他语言来说可能有点不寻常,在其他语言中,将所有依赖项与代码捆绑在一起并不罕见。
因此,即使您能够构建包以包含另一个轮子(默认情况下该轮子不起作用,因为默认情况下setuptools仅包含.pysdist/bdist 中的文件),也无法知道pip依赖项是否可达。我看到有四种选择可以用 python 支持的方式解决你的问题。
localdep上的版本,或将其上传到那里。但如果有可能的话,你可能就不会问这个问题了。localdep在您的控制之下并且仅由 所使用mypackage,请将其写为 的一个简单子模块mypackage- 阅读,制作自己的包的最初决定localdep是过度设计,这可能是真的,也可能不是。localdep。请阅读本指南,了解所有注意事项和陷阱的深入解释,或者如果您想让它正常工作而不需要真正理解原因或方式,请阅读这篇黑客文章。驾驶室部分需要更多的文字,但它可能最接近您最初的想法。在这种方法中,您不需要包含在您的项目中,并且最好删除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来安装您的软件包。
Poetry 是一个用于开发包的依赖管理器,因此它不会过多地处理部署问题,并且仅以切线为目标。这通常很好,因为pip正如我们所见,在这方面非常有能力。pip开发过程中不太方便,这就是为什么诗歌很好,但诗歌并不能完全取代pip。