如何让setup.py的install_requires跳过已安装的私有仓库依赖?
解决方案
你遇到的问题本质是setuptools处理带URL的依赖声明时,默认会忽略本地已安装版本,强制访问URL做包校验,以下是对应你两个需求的可落地实现:
方案1:按版本要求自动跳过已满足的依赖
该方案会自动检测本地是否安装了符合最低版本要求的pyGSO,满足则不添加私有仓库依赖声明,避免触发仓库访问:
- 首先在
setup.py开头添加依赖检测逻辑:from setuptools import setup from pkg_resources import get_distribution, DistributionNotFound, VersionConflict # 自定义pyGSO的最低兼容版本 PYGSO_MIN_VERSION = "1.0.0" pygso_version_req = f"pyGSO>={PYGSO_MIN_VERSION}" pygso_dep = [] try: # 校验本地已安装版本是否符合要求 get_distribution(pygso_version_req) except (DistributionNotFound, VersionConflict): # 未安装/版本不符合时才添加私有仓库依赖 pygso_dep = [ f"pyGSO @ git+https://dev.azure.com/.../pyGSO@Main#egg=pyGSO-{PYGSO_MIN_VERSION}" ] - 修改
setup的install_requires配置,插入动态生成的依赖项:setup( name="parasol", version="2.18.1", # 其他原有配置保持不变 install_requires=[ # 其他原有依赖保持不变 *pygso_dep, ], )
注意:URL末尾加
#egg=pyGSO-版本号后缀是为了让setuptools能直接识别依赖版本,减少不必要的校验请求。
方案2:显式控制是否跳过私有依赖校验
如果需要更明确的离线安装控制,可以加环境变量开关,手动确认已安装pyGSO时直接跳过该依赖的声明:
setup.py代码调整如下:import os from setuptools import setup # 读取环境变量判断是否为离线安装模式 OFFLINE_MODE = os.getenv("PARASOL_OFFLINE", "0").lower() in ("1", "true", "yes") pygso_dep = [] if not OFFLINE_MODE: pygso_dep = ["pyGSO @ git+https://dev.azure.com/.../pyGSO@Main"] setup( name="parasol", version="2.18.1", # 其他原有配置保持不变 install_requires=[ # 其他原有依赖保持不变 *pygso_dep, ], )- 离线环境安装操作:
先手动完成pyGSO的安装,再运行安装命令时开启离线模式即可:- Linux/macOS终端:
PARASOL_OFFLINE=1 pip install . - Windows CMD:
set PARASOL_OFFLINE=1 && pip install . - Windows PowerShell:
$env:PARASOL_OFFLINE=1; pip install .
- Linux/macOS终端:
内容的提问来源于stack exchange,提问作者Wyko ter Haar
相关产品推荐
相关产品推荐

