能否用setuptools_scm在运行时检查本地版本是否落后于Git版本?
实现运行时检查Git仓库版本更新的方案
因为setuptools_scm仅负责安装阶段提取版本号,运行时的版本更新检查需要直接通过Git命令操作仓库,并结合版本号解析逻辑实现。以下是针对本地开发场景的具体方案:
核心思路
- 提取本地已安装包的版本号(你已通过
version.py实现) - 通过Git命令拉取远程仓库的所有标签,筛选出有效版本标签
- 对比本地版本与远程最新版本,输出提示或阻止运行
步骤与代码实现
1. 依赖准备
首先安装版本解析工具packaging,用于统一处理版本号的对比:
pip install packaging
2. 编写版本检查函数
在CLI入口模块中添加以下函数:
from packaging.version import parse, Version import subprocess import sys from .version import __version__ def check_for_updates(): # 处理本地版本的前缀与dirty后缀(如v1.0.0+dirty) clean_version = __version__.split('+')[0].lstrip('v') try: current_ver = parse(clean_version) except ValueError: print(f"无法解析本地版本: {__version__}", file=sys.stderr) return try: # 获取远程仓库所有标签 result = subprocess.run( ["git", "ls-remote", "--tags", "origin"], capture_output=True, text=True, check=True ) # 筛选并解析有效版本标签 valid_tags = [] for line in result.stdout.splitlines(): _, ref = line.split('\t', 1) if ref.startswith('refs/tags/v'): tag = ref.split('/')[-1].lstrip('v') try: valid_tags.append(parse(tag)) except ValueError: continue # 跳过非标准版本标签 if not valid_tags: print("未找到远程版本标签", file=sys.stderr) return # 获取远程最新版本 latest_ver = max(valid_tags) # 版本对比与提示 if latest_ver > current_ver: print(f"⚠️ 警告:发现新版本 v{latest_ver},当前版本 v{current_ver}。请执行 git pull 后重新安装!", file=sys.stderr) # 若要强制阻止旧版本运行,取消下方注释 # sys.exit(1) elif latest_ver == current_ver: print("✅ 当前已是最新版本", file=sys.stderr) else: print(f"ℹ️ 当前版本 v{current_ver} 高于远程最新版本 v{latest_ver}", file=sys.stderr) except subprocess.CalledProcessError as e: print(f"Git命令执行失败: {e.stderr.strip()}", file=sys.stderr) except Exception as e: print(f"版本更新检查出错: {str(e)}", file=sys.stderr)
3. 在CLI启动时调用检查
在CLI入口的最开始执行检查:
# CLI模块的启动入口 if __name__ == "__main__": check_for_updates() # 后续执行原有CLI命令逻辑...
注意事项
- 确保用户环境已安装Git,且本地仓库已配置远程
origin(可通过git remote add origin <你的GitLab仓库地址>配置) - 若仓库使用非
origin的远程名称,需修改函数中的远程参数 - 可根据需求调整提示文案,或通过
sys.exit(1)强制终止旧版本运行
内容的提问来源于stack exchange,提问作者tospo
相关产品推荐
相关产品推荐

