pre-commit运行时如何动态传参覆盖yaml配置的hook参数
方案1:运行时动态覆盖钩子参数(零配置改动,适配少量特殊项目)
pre-commit原生支持执行阶段通过--hook-config参数覆盖指定钩子的args配置,不需要改动全局通用的.pre-commit-config.yaml文件。
比如仅需dev环境的项目,直接执行以下命令即可跳过不存在的uat、prod var-file校验:
pre-commit run terraform_tflint --hook-config args="--args=--var-file=dev.tfvars"
如果需要长期适配,可以在项目根目录新建简单的环境配置文件(比如.tflint_envs,每行写一个环境名),再封装一个极简shell脚本自动拼接参数,替代直接调用pre-commit命令:
#!/bin/bash # 脚本名:tf-precheck,赋予执行权限后加入系统PATH即可全局调用 VAR_ARGS="" # 优先读取项目自定义的环境列表 if [ -f .tflint_envs ]; then while IFS= read -r env; do # 跳过空行和注释行 [[ -z "$env" || "$env" =~ ^# ]] && continue VAR_ARGS+="--args=--var-file=${env}.tfvars " done < .tflint_envs else # 无自定义配置时默认加载三套环境 VAR_ARGS="--args=--var-file=dev.tfvars --args=--var-file=uat.tfvars --args=--var-file=prod.tfvars" fi pre-commit run terraform_tflint --hook-config args="$VAR_ARGS" "$@"
后续不管项目需要几个环境,只需要在.tflint_envs里写对应环境名即可,不需要改动pre-commit主配置。
方案2:改造钩子入口自动扫描tfvars文件(一劳永逸,适合全量推广)
直接修改通用.pre-commit-config.yaml里的terraform_tflint钩子配置,通过自定义entry逻辑自动扫描当前项目下存在的.tfvars文件,动态传入参数,完全不需要手动适配每个项目:
repos: - repo: https://github.com/antonbabenko/pre-commit-terraform rev: v1.64.0 hooks: - id: terraform_tflint args: [] entry: bash -c ' set -e TFLINT_ARGS="" # 扫描当前目录所有.tfvars文件,自动拼接为var-file参数 for tfvar_file in *.tfvars; do [ -f "$tfvar_file" ] && TFLINT_ARGS+="--args=--var-file=$tfvar_file " done # 调用原始tflint钩子执行校验 exec terraform_tflint $TFLINT_ARGS "$@" ' --
该配置会自动适配1个、3个甚至更多tfvars文件的场景,不存在的文件不会被传入,从根源上避免找不到文件的报错。
方案3:项目级配置覆盖(适配差异较大的特殊项目)
pre-commit默认优先读取当前执行目录下的.pre-commit-config.yaml配置,对于差异较大的特殊项目,可以直接在项目内的配置文件中重写terraform_tflint的args参数,只保留自身需要的var-file配置即可,不会影响全局通用规则。
注意:使用--hook-config传参时,参数格式需要和yaml配置内的args格式完全一致,多个参数间用空格分隔,避免出现转义错误。
内容的提问来源于stack exchange,提问作者Dương Quang Thọ

