如何将私有依赖库的wheel打包进主应用的wheel中?
方案1:内嵌私有依赖Wheel并自动安装(推荐)
这个方案通过setuptools把私有库的Wheel包嵌入到应用包中,再通过安装后的脚本自动完成依赖安装,客户只需执行pip install x.whl即可。
步骤:
准备私有依赖Wheel:
在内部网络(连VPN)下载私有库的Wheel包,放到应用项目的指定目录,比如your_app_package/vendor/(your_app_package是你的应用源码包目录)。配置setuptools包含内嵌文件:
修改setup.py,通过package_data将私有Wheel纳入打包范围:from setuptools import setup, find_packages setup( name="your_app", version="1.0.0", packages=find_packages(), # 配置内嵌的私有依赖Wheel package_data={ "your_app_package": ["vendor/private_lib-1.0.0-py3-none-any.whl"], }, include_package_data=True, # 公共依赖正常声明,私有依赖不要在这里加(避免客户安装时触发远程下载) install_requires=[ "requests>=2.25.1", # 不要加"private_lib>=1.0.0" ], )添加安装后自动安装脚本:
在setup.py中自定义安装命令,在应用安装完成后自动安装内嵌的私有Wheel:import os import sys import subprocess from setuptools import setup, find_packages from setuptools.command.install import install class PostInstall(install): def run(self): # 先执行标准安装流程 install.run(self) # 获取应用安装后的目录路径 app_install_dir = os.path.join(self.install_lib, "your_app_package") wheel_path = os.path.join(app_install_dir, "vendor", "private_lib-1.0.0-py3-none-any.whl") # 调用当前环境的pip安装内嵌Wheel subprocess.run( [sys.executable, "-m", "pip", "install", wheel_path], check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE ) setup( name="your_app", version="1.0.0", packages=find_packages(), package_data={ "your_app_package": ["vendor/private_lib-1.0.0-py3-none-any.whl"], }, include_package_data=True, install_requires=[ "requests>=2.25.1", ], # 指定自定义安装命令 cmdclass={"install": PostInstall}, )区分内部/外部构建:
如果需要在内部环境仍能通过--extra-index-url正常安装(依赖私有仓库),可以通过环境变量控制:import os install_requires = ["requests>=2.25.1"] # 内部构建时添加私有依赖声明 if os.getenv("INTERNAL_BUILD") == "1": install_requires.append("private_lib>=1.0.0") # 后续setup配置中使用这个install_requires内部构建Wheel时执行:
INTERNAL_BUILD=1 python setup.py bdist_wheel给客户的外部构建则直接执行
python setup.py bdist_wheel。
方案2:构建包含所有依赖的"胖Wheel"(适用于纯Python依赖)
在内部环境中,直接构建包含私有依赖的应用Wheel,本质是把依赖的代码合并到应用Wheel中:
先在内部环境安装
wheel和setuptools:pip install wheel setuptools>=42用
pip wheel命令构建应用及所有依赖的Wheel,同时指定私有仓库地址:pip wheel --wheel-dir=./dist --extra-index-url=https://your-gitlab-private-repo.com/simple/ ./这会把应用和所有依赖(包括私有库)的Wheel下载到
./dist目录。使用
wheel工具合并依赖:
解压应用Wheel和私有依赖Wheel,把私有库的源码目录复制到应用Wheel的site-packages目录下,然后重新打包Wheel。这个步骤可以写脚本自动化,适合依赖较少的场景。
注意事项:
- 每次私有库版本更新,都要同步替换应用项目中的内嵌Wheel文件,确保版本匹配。
- 方案1的post-install脚本在某些严格的环境(如无pip权限的系统)可能受限,需提前测试。
- 避免在
install_requires中声明私有依赖,防止客户安装时触发远程下载报错。
内容的提问来源于stack exchange,提问作者Adam Korba

