如何在tox 3.14中标记toxenv为无效以自动重建环境
在tox 3.14中自动检测Protobuf文件更新并触发环境重建
针对你的需求,核心思路是检测Protobuf文件的变更,当文件更新时主动失效tox环境的有效性标记,让tox在下一次运行时自动重建环境,无需手动传递-r/--recreate参数。以下是具体实现方案:
方案1:通过Python脚本检测哈希变化并删除有效性标记
编写一个脚本监控所有.proto文件的哈希值,当哈希变化时删除tox环境的.tox-info文件(该文件记录环境有效性的校验信息,删除后tox会认为环境需要重建)。
步骤1:编写检测脚本
创建check_proto_changes.py文件:
import hashlib import os from pathlib import Path # 配置要监控的Protobuf文件路径(可根据实际项目调整) TARGET_PROTO_FILES = list(Path(".").glob("**/*.proto")) # tox环境目录,由tox自动传入环境变量TOX_ENV_DIR TOX_ENV_DIR = os.environ.get("TOX_ENV_DIR") # 保存上次哈希值的文件 HASH_RECORD_FILE = ".proto_hash" def calculate_proto_hash() -> str: """计算所有目标Protobuf文件的合并哈希值""" hash_calculator = hashlib.md5() for proto_file in TARGET_PROTO_FILES: with open(proto_file, "rb") as f: hash_calculator.update(f.read()) return hash_calculator.hexdigest() current_hash = calculate_proto_hash() # 对比哈希值,判断是否需要触发重建 if os.path.exists(HASH_RECORD_FILE): with open(HASH_RECORD_FILE, "r") as f: saved_hash = f.read().strip() else: saved_hash = "" if current_hash != saved_hash: # 更新哈希记录文件 with open(HASH_RECORD_FILE, "w") as f: f.write(current_hash) # 删除tox环境的有效性标记文件 if TOX_ENV_DIR: tox_info_path = Path(TOX_ENV_DIR) / ".tox-info" if tox_info_path.exists(): tox_info_path.unlink() print(f"Detected Protobuf changes, deleted {tox_info_path} to trigger rebuild")
步骤2:在tox配置中集成脚本
修改tox.ini,将脚本加入install_command的前置步骤(确保在处理依赖前执行检测):
[testenv] # 先执行哈希检测脚本,再运行你的自定义安装/生成脚本 install_command = python check_proto_changes.py && your_custom_protobuf_script.sh {opts} {packages}
方案2:通过Shell脚本检测文件修改时间
如果你更倾向于Shell脚本,可以通过对比Protobuf文件和tox环境标记文件的修改时间来触发重建:
步骤1:编写Shell检测脚本
创建check_proto_changes.sh文件:
#!/bin/bash set -e # 查找所有Protobuf文件 PROTO_FILES=$(find . -name "*.proto" -type f) # tox环境目录 TOX_ENV_DIR="${TOX_ENV_DIR}" # tox环境有效性标记文件 TOX_INFO_FILE="${TOX_ENV_DIR}/.tox-info" # 获取环境标记文件的修改时间(若不存在则设为0) if [ -f "${TOX_INFO_FILE}" ]; then ENV_MTIME=$(stat -c %Y "${TOX_INFO_FILE}") else ENV_MTIME=0 fi # 检查每个Protobuf文件的修改时间 for file in ${PROTO_FILES}; do FILE_MTIME=$(stat -c %Y "${file}") if [ "${FILE_MTIME}" -gt "${ENV_MTIME}" ]; then echo "Protobuf file ${file} updated, triggering environment rebuild" rm -f "${TOX_INFO_FILE}" exit 0 fi done
步骤2:在tox配置中集成脚本
修改tox.ini:
[testenv] install_command = bash check_proto_changes.sh && your_custom_protobuf_script.sh {opts} {packages}
关键说明
.tox-info文件的作用:tox 3.x通过该文件存储环境的校验哈希(包含依赖版本、配置内容等),当文件被删除,tox无法验证环境有效性,会自动执行完整的环境重建流程。- 环境变量
TOX_ENV_DIR:tox在运行每个环境的命令时,会自动设置该变量,指向当前环境的目录(例如.tox/py37),确保脚本能精准定位到目标环境的标记文件。 - 脚本执行时机:将检测脚本放在
install_command的最前面,确保在处理依赖和生成pb.py之前完成环境有效性的判断。
内容的提问来源于stack exchange,提问作者murison
相关产品推荐
相关产品推荐

