How to fix the YAML syntax error: did not find expected '-' indicator while parsing a block?

How to fix the YAML syntax error: did not find expected '-' indicator while parsing a block?

我在 .travis.yml 中为 Python 库编写了一些代码。使用 lint.travis-ci.org,我了解到我的 YAML 文件中存在一些缩进问题。这是错误指向的部分

install:

  - if [[ "${TEST_PY3}" == "false" ]]; then
      pip install Cython;
      python setup.py build; # To build networkx-metis
      mkdir core; # For the installation of networkx core
      cd core;
      git clone https://github.com/orkohunter/networkx.git;
      cd networkx/;
      git checkout addons;
      python setup.py install;
      cd ..;
    fi

我哪里错了?错误显示

syntax error: (<unknown>): did not find expected '-' indicator while parsing a block collection at line 32 column 3

如果有像autopep8这样的工具来修复YAML文件的缩进就好了。

您的文件中没有 32 行(可能是因为您从示例中删除了非必要数据),但缩进级别指向带有 fi 的行。

实际上问题出现得更早,您要做的是将要执行的操作指定为多行字符串。您可以通过多种方式在 YAML 中指定它们,但最干净的方法是使用 literal scalar 指示符“|”,它会保留换行符:

install:

  - |
    if [[ "${TEST_PY3}" == "false" ]]; then
      pip install Cython;
      python setup.py build; # To build networkx-metis
      mkdir core; # For the installation of networkx core
      cd core;
      git clone https://github.com/orkohunter/networkx.git;
      cd networkx/;
      git checkout addons;
      python setup.py install;
      cd ..;
    fi

没有针对此类错误的自动 YAML 重新缩进工具。

Python 的重新缩进采用工作代码并使缩进保持一致(替换 TAB,每个级别的缩进始终相同)。 Python 对有语法错误的代码重新缩进,要么不起作用,要么可能产生不正确的结果。

YAML 的重缩器面临同样的问题:如果输入没有意义该怎么办(你我都清楚的事情,程序并不总是清楚)。仅仅将所有不能很好解析的东西变成多线标量并不是一个通用的解决方案。

除此之外,大多数 YAML 解析器会丢弃一些有关读取文件的信息,您不希望通过重新缩进丢失这些信息,包括 EOL 注释、手工制作的锚点名称、映射键顺序等。都没有违反规范中的要求。

如果你想统一缩进你的(正确的)YAML,你可以使用 yaml 实用程序,它是 [ruamel.yaml][2] 包的一部分(免责声明:我是该包的作者)。与 yaml round-trip .travis.yml 一起使用的原始输入将给出:

 ...
  in "<byte string>", line 3, column 3:
      - if [[ "${TEST_PY3}" == "false" ... 
      ^
expected <block end>, but found '<scalar>'
  in "<byte string>", line 6, column 7:
          mkdir core; # For the installati ...

不幸的是,在查找错误方面没有太大帮助,正确的 .travis.yml 版本 运行 到 yaml round-trip .travis.yml 会告诉你它在第二次往返时稳定下来(即。第一个额外的空格丢失了)。 yaml round-trip .travis.yml --save 给你:

install:
- |
  if [[ "${TEST_PY3}" == "false" ]]; then
    pip install Cython;
    python setup.py build; # To build networkx-metis
    mkdir core; # For the installation of networkx core
    cd core;
    git clone https://github.com/orkohunter/networkx.git;
    cd networkx/;
    git checkout addons;
    python setup.py install;
    cd ..;
  fi

请注意,此 # TO build networkx-metis 不是 YAML 注释。它只是多行字符串的一部分。但是,第一行之前或最后一行之后的注释将被保留。

这个错误意味着你有语法错误,这个细节很难追踪,因为它可能意味着多种情况,错误的缩进,包括缺少双引号,或者你需要确保双引号一些特殊字符。

如果您在 git 存储库中跟踪您的 .travis.yml,使用 travis 命令您可以轻松检查以前的版本并进行比较。

例如:

$ travis lint <(git show HEAD^:.travis.yml )
Warnings for /dev/fd/63:
[x] syntax error: (<unknown>): did not find expected '-' indicator while parsing a block collection at line 61 column 3
$ travis lint <(git show HEAD~2:.travis.yml)
Hooray, /dev/fd/63 looks valid :)

其中 HEAD~2 正在检查后面的 2 个提交,所以不断增加数字直到它起作用,一旦找到,然后比较:

git diff HEAD~2 .travis.yml

否则分成更小的部分或继续删除一些部分直到它起作用。


使用 ruby 是检查 YAML 语法的替代方法:

ruby -e "require 'yaml';puts YAML.load_file('.travis.yml')"

所以你不需要每次都通过 travis POST 你的代码,它的工作方式与 Travis WebLint.

类似

例子

以下语法不正确:

language: python
before_script:
  - |
    true
# Some comment.
    true

因为评论有错误的缩进:

[x] syntax error: (): did not find expected '-' indicator while parsing a block collection at line 3 column 3

这是有效的语法:

language: python
before_script:
  - |
    true
    # Some comment.
    true

上述问题尤其发生在编辑 Vim 中的文件时,它正在缩进注释,使它们从头开始。

对我来说,我的文件中第 17 行报告了这个错误,但实际上有一个无效评论(我使用 -- 而不是 #)我的配置中的第 84 行...更正注释后,错误“第 17 行”消失了。

#justyamlthings