【问题标题】:How to fix the YAML syntax error: did not find expected '-' indicator while parsing a block?如何修复 YAML 语法错误:解析块时未找到预期的“-”指示符?
【发布时间】:2015-09-15 06:44:45
【问题描述】:

我在.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 文件的缩进,那就太好了。

【问题讨论】:

  • “要求我们推荐或查找书籍、工具、软件库、教程或其他场外资源的问题对于 Stack Overflow 来说是题外话,因为它们往往会吸引固执己见的答案和垃圾邮件。” 此外,“yaml linter” 让我在 Google 上获得了 15000 次点击,所以不妨考虑做一些研究。
  • 是的,15k 次点击 +1。我不是在谈论验证而是更正我的文件。所有这些谷歌点击都提供验证。我做了一些研究,找不到任何工具、软件库等。这就是为什么没有机会获得固执的答案。谢谢。
  • 不过,与所有推荐问题一样,这个问题在 Stack Overflow 上是题外话。如果您可以提供目的和一些客观要求(您的问题目前缺乏),它可能会成为 SoftwareRecs 的主题 - 请参阅 softwarerecs.stackexchange.com/help/on-topic
  • 感谢您的帮助。
  • @HimanshuMishra 你的“我哪里错了?”这个问题适合这个网站。不需要像 autopep8 这样的工具。我改变了问题,所以它在Stack Overflow的范围内

标签: syntax-error yaml indentation travis-ci


【解决方案1】:

该错误意味着您有语法错误,而且这一点很难跟踪,因为它可能意味着多种情况、错误的缩进,包括缺少双引号,或者您需要确保对某些特殊字符进行双引号。

如果您在 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 发布您的代码,其工作方式与Travis WebLint 类似。


示例

以下语法不正确:

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

因为注释的缩进错误:

[x] 语法错误:(): 在第 3 行第 3 列解析块集合时未找到预期的“-”指示符

这是有效的语法:

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

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

【讨论】:

    【解决方案2】:

    您的文件中没有 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 的 Reindenters 采用工作代码并使缩进保持一致(替换 TAB,每个级别总是相同的缩进)。对有语法错误的代码进行 Python 代码重新缩进,要么不起作用,要么可能产生不正确的结果。

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

    除此之外,大多数 YAML 解析器在读取文件时会丢弃一些信息,您不希望因重新缩进而丢失,包括 EOL cmets、手工制作的锚名称、映射键排序等。违反规范中的要求。

    如果你想统一缩进你的(正确的)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 ...
    

    不幸的是,在查找错误方面没有多大帮助,通过yaml round-trip .travis.yml 运行的正确.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 注释。它只是多行字符串的一部分。然而,在第一行之前或最后一行之后的注释将被保留。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-13
      • 2022-07-29
      • 2022-01-12
      • 2021-01-27
      • 1970-01-01
      • 2017-03-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多