如何为bdist wheel固定依赖版本同时保留开发安装的非固定依赖
Python项目区分wheel分发依赖与开发版依赖的解决方案
你可以直接在setup.py中通过判断当前执行的命令类型,动态设置install_requires的值,完全不需要用户手动执行多步命令,方案实现如下:
实现逻辑
核心思路是检测当前运行环境是否为wheel构建场景:
- 如果是构建bdist wheel的场景,就使用带固定版本号的依赖列表,保证终端用户安装wheel时的依赖版本符合预期
- 如果是普通安装/可编辑安装(开发场景),就使用不固定版本的依赖列表,自动拉取最新版本做兼容性测试
代码示例
修改你的setup.py代码如下:
import sys from setuptools import setup # 定义两类依赖:固定版本供wheel分发使用,不固定版本供开发场景使用 pinned_dependencies = [ "numpy==1.20.0", "scipy==1.7.3", "matplotlib==3.4.3" ] unpinned_dependencies = [ "numpy", "scipy", "matplotlib" ] # 判断是否处于wheel构建场景 is_wheel_build = "bdist_wheel" in sys.argv setup( # 其他原有配置项保持不变 install_requires=pinned_dependencies if is_wheel_build else unpinned_dependencies, )
验证方法
- 构建wheel时执行原有命令
pip wheel . --no-deps即可,生成的wheel包内METADATA文件会自动携带固定版本的依赖声明,终端用户安装时会拉取对应版本的依赖 - 开发场景执行
pip install -e .时,会自动使用不固定版本的依赖列表,拉取各依赖的最新版本,满足兼容性测试需求
增强兼容方案
如果担心存在特殊构建场景没有命中bdist_wheel参数的判断,可以额外增加环境变量判断逻辑,修改判断部分代码如下:
import os import sys is_wheel_build = "bdist_wheel" in sys.argv or os.getenv("PROJECT_BUILD_WHEEL") == "1"
你自己构建wheel时执行PROJECT_BUILD_WHEEL=1 pip wheel . --no-deps即可,进一步降低误判概率。
内容的提问来源于stack exchange,提问作者Sean
相关产品推荐
相关产品推荐

