如何在GitHub Action中确定C编译器版本并用于缓存键?
获取C编译器版本并纳入缓存键的实用方法
一、提取MSVC(cl.exe)版本号
Windows上的cl.exe可以直接通过命令输出提取版本:
- 直接运行
cl,第一行输出会包含完整版本标识(例如Microsoft (R) C/C++ Optimizing Compiler Version 19.36.32532 for x86),可以用字符串截取或正则提取核心版本号(如19.36.32532); - 用
cl /Bv命令能输出更详细的版本信息,其中明确标注Version字段,正则匹配更精准。
用Python脚本自动提取的示例:
import subprocess import re def get_cl_version(): try: # 捕获cl命令的输出 result = subprocess.run(['cl'], capture_output=True, text=True) # 匹配版本号格式 version_match = re.search(r'Version (\d+\.\d+\.\d+)', result.stdout) if version_match: return version_match.group(1) except: # 若cl不在PATH,需先激活VS环境(比如执行vcvarsall.bat) pass return None
二、将版本号整合到缓存键中
1. GitHub Actions 场景
在缓存步骤前先提取版本,再把版本作为缓存key的一部分:
- name: 获取MSVC版本 id: cl_version shell: pwsh run: | $cl_output = cl $version = ($cl_output | Select-String 'Version (\d+\.\d+\.\d+)').Matches.Groups[1].Value echo "cl_version=$version" >> $env:GITHUB_OUTPUT - name: 缓存编译产物 uses: actions/cache@v3 with: path: ./your-library-path key: ${{ runner.os }}-cl-${{ steps.cl_version.outputs.cl_version }}-${{ hashFiles('**/*.c', '**/*.h') }}
2. 本地/脚本构建场景
在setup.py中先获取版本,再生成带版本标识的缓存键:
# 先调用上面的get_cl_version()获取版本 cl_version = get_cl_version() # 结合版本和源码哈希生成唯一缓存键 cache_key = f"build-cache-cl-{cl_version}-{hash(open('setup.py').read())}" # 构建逻辑中先检查对应缓存是否存在,存在则直接复用,否则重新编译
三、关键注意点
- 如果cl.exe不在系统PATH中,必须先激活Visual Studio的环境变量(比如执行
vcvarsall.bat x64),确保能正常调用cl; - 版本提取的正则可以根据实际输出微调,确保精准匹配到你需要的版本段(比如你遇到的14.36.32532);
- 缓存键建议同时加入源码文件的哈希值,避免源码变更时仍复用旧缓存。
内容的提问来源于stack exchange,提问作者Frank Yellin
相关产品推荐
相关产品推荐

