Poetry构建时能否将指定内部依赖打包进Wheel?
问题描述
我们有一个内部库,项目的pyproject.toml配置如下:
[tool.poetry] ... packages = [{ include = "my_package" }] [[tool.poetry.source]] url = "https://pypi.fury.io/<OUR_REPO>/" name = "fury" secondary = true [tool.poetry.dependencies] python = "^3.8.10" some-internal-lib = "^1" ...
执行poetry build命令时,some-internal-lib未被包含在生成的Wheel中。由于目标运行环境无法访问内部仓库,我们需要将该依赖打包进Wheel,实现类似Java/Scala的uber jar效果,请问有可行方式?
可行解决方案
方案1:使用poetry-plugin-bundle插件(推荐)
这个官方插件专门支持构建包含依赖的"胖包":
- 安装插件:
poetry self add poetry-plugin-bundle - 执行打包命令,直接生成包含所有依赖的wheel:
生成的包会把poetry bundle wheel --output dist/my_package-fat-0.1.0.wheelsome-internal-lib等依赖直接嵌入,目标环境无需额外拉取依赖。
方案2:手动嵌入依赖
如果不想用插件,可通过手动复制的方式实现:
- 执行
poetry install安装所有依赖到本地虚拟环境,找到some-internal-lib的安装目录(一般在venv/lib/python3.8/site-packages/some_internal_lib) - 将整个
some_internal_lib目录复制到项目根目录(与my_package同级) - 修改
pyproject.toml的packages配置,把嵌入的依赖加入:[tool.poetry] packages = [ { include = "my_package" }, { include = "some_internal_lib" } ] - 删除
[tool.poetry.dependencies]中的some-internal-lib条目,避免构建时冲突 - 执行
poetry build,生成的wheel会包含项目代码和内部依赖
方案3:手动构建胖Wheel(临时场景适用)
- 先执行
poetry build生成普通的wheel和源码包 - 安装必要工具:
pip install wheel pip - 创建临时目录,解压源码包并安装所有依赖到指定目录:
mkdir temp_build && cd temp_build tar xzf ../dist/my_package-0.1.0.tar.gz cd my_package-0.1.0 pip install . --target ../lib - 将
lib目录下的所有内容打包成新的wheel(可自行修改包名标识为胖包版本)
内容的提问来源于stack exchange,提问作者YFl
相关产品推荐
相关产品推荐

