你的文件中没有32行(可能是因为你从示例中剥离了非必要数据),但缩进级别指向带有fi
的行。
实际上,问题开始得更早,你要做的是将要执行的操作指定为多行字符串。你可以用多种方式在YAML中指定这些内容,但最干净的方法是使用文字标量指示符 "|
",它会保留换行符:
install:
- |
if [[ "${TEST_PY3}" == "false" ]]; then
pip install Cython;
python setup.py build;
mkdir 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,则可以使用ruamel.yaml包中的yaml实用程序(免责声明:我是该包的作者)。您用于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;
很遗憾,这并没有帮助我们找到错误,通过运行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;
mkdir 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注释,它只是多行字符串的一部分。然而,在第一行之前或最后一行之后的注释将会被保留。