You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否用setuptools_scm在运行时检查本地版本是否落后于Git版本?

实现运行时检查Git仓库版本更新的方案

因为setuptools_scm仅负责安装阶段提取版本号,运行时的版本更新检查需要直接通过Git命令操作仓库,并结合版本号解析逻辑实现。以下是针对本地开发场景的具体方案:

核心思路

  1. 提取本地已安装包的版本号(你已通过version.py实现)
  2. 通过Git命令拉取远程仓库的所有标签,筛选出有效版本标签
  3. 对比本地版本与远程最新版本,输出提示或阻止运行

步骤与代码实现

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 06:35:10