使用预提交挂钩获得 "E0000 Template needs to be an object."

With pre-commit hook getting "E0000 Template needs to be an object."

cfn-lint 版本:0.53.0

问题描述。

我的 Ubuntu 机器上有以下设置

  1. cfn-lint
  2. cfn-python-lint via pre-commit

案例 1:如果我 运行 cfn-lint ./**/*.yml 从终端在项目根文件夹然后没有错误

案例 2:如果我现在尝试 git 提交安装了预提交的代码,它会给出以下错误“E0000 Template needs to be an object ”对于参数 JSON file.

参数 JSON 看起来像这样:

[
  {
    "ParameterKey": "XKey",
    "ParameterValue": "XValue"
  },
  {
    "ParameterKey": "YKey",
    "ParameterValue": "YValue"
  },
 ..
 ..
 ..
 ..
]

.pre-commit-config.yaml 个文件看起来像

repos:
-   repo: https://github.com/pre-commit/pre-commit-hooks
    rev: v3.4.0
    hooks:
    -   id: trailing-whitespace
    -   id: end-of-file-fixer
    -   id: check-added-large-files
    -   id: pretty-format-json
        args:
            - --autofix
-   repo: https://github.com/awslabs/cfn-python-lint
    rev: v0.53.0
    hooks:
    -   id: cfn-python-lint
        files: ./.*\.(json|yml|yaml)$

在情况 1 中,您只匹配具有 *.yml 扩展名而不是 JSON 扩展名的文件。但是,在情况 2 中,作为您的预提交挂钩,您也包含 json 文件。这意味着它可能会尝试将您的参数 JSON 文件解释为 CloudFormation 文件。

您的参数文件不是 CloudFormation,而是一个包含一些值的简单 JSON 数组。 CloudFormation 文件始终是一个对象,绝不是顶层的数组。这将解释错误消息。解决方案:仅在您的 cfn-python-lint 扫描中包含实际上是 CloudFormation 文件的文件。