如何修复YAML语法错误:在解析块时未找到预期的" - "指示符?

Him*_*hra 18 yaml indentation syntax-error travis-ci

我有一些代码写在我.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
Run Code Online (Sandbox Code Playgroud)

我哪里错了?错误说

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

如果有一个工具autopep8可以修复YAML文件的缩进,那将会很棒.

Ant*_*hon 8

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

实际上问题是早些开始的,你想要做的是指定要作为多行字符串的操作.您可以通过多种方式在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
Run Code Online (Sandbox Code Playgroud)

对于这类错误,没有自动YAML重新缩进工具.

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

YAML的Reindenters面临着同样的问题:如果输入没有意义怎么办(你和我清楚的是,程序并不总是清楚).只是将所有不能很好地解析为多行标量的东西都不是通用的解决方案.

除此之外,大多数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 ...
Run Code Online (Sandbox Code Playgroud)

不幸的是,在查找错误方面没有多大帮助,正确的.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
Run Code Online (Sandbox Code Playgroud)

请注意,这# TO build networkx-metis不是YAML评论.它只是多行字符串的一部分.然而,将保留对第一行之前或之后的行的注释.


ken*_*orb 5

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

如果您跟踪.travis.ymlgit存储库中的内容,则可以使用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 :)
Run Code Online (Sandbox Code Playgroud)

HEAD~2检查2提交的位置在哪里,因此请继续增加数量,直到找到它,然后进行比较,如下所示:

git diff HEAD~2 .travis.yml
Run Code Online (Sandbox Code Playgroud)

否则,请分成较小的部分,或继续删除某些部分,直到它起作用为止。


使用ruby是检查YAML语法的另一种方法:

ruby -e "require 'yaml';puts YAML.load_file('.travis.yml')"
Run Code Online (Sandbox Code Playgroud)

因此您不需要每次都通过POST来执行代码,travis该方式的工作方式与Travis WebLint相似。


以下语法不正确:

language: python
before_script:
  - |
    true
# Some comment.
    true
Run Code Online (Sandbox Code Playgroud)

因为注释的缩进错误:

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

这是有效的语法:

language: python
before_script:
  - |
    true
    # Some comment.
    true
Run Code Online (Sandbox Code Playgroud)

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