Как исправить синтаксическую ошибку YAML: не нашел ожидаемого индикатора " - " при разборе блока?
у меня есть код, написанный в моем .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.
2 ответов
у вас нет 32 строк в вашем файле (возможно, потому, что вы удалили несущественные данные из примера), но уровень отступа указывает на строку с fi
.
на самом деле проблема начинается раньше, и то, что вы хотите сделать, это указать действие в виде многострочной строки. Вы можете указать их в YAML несколькими способами, но самый чистый-использовать буквальное скалярное индикатор "|
", который сохраняет newlines:
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 для такого рода ошибок.
Reindenters для Python берут рабочий код и делают отступ согласованным (заменяя вкладки, всегда одинаковый отступ на уровень). Повторный отступ кода Python в коде с синтаксическими ошибками либо не работает, либо может привести к неправильным результатам.
Reindenters для 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. Это просто часть многострочной строки. Однако комментарий к строке до первой или после последней будет сохранен.
ошибка означает, что у вас есть синтаксическая ошибка, и это особенно трудно отслеживать, так как это может означать несколько вещей, неправильный отступ, в том числе отсутствующую двойную кавычку или вам нужно убедиться, что двойные кавычки некоторые специальные символы.
в случае, если вы следите за своим .travis.yml
в репозитории git, используя вы можете легко проверить предыдущие версии и сравнить.
например:
$ 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
который работает аналогичным образом, как Тревис WebLint.
пример
следующий синтаксис неправильный:
language: python
before_script:
- |
true
# Some comment.
true
потому что комментарий имеет неправильный отступ согласно:
[x] синтаксическая ошибка: (): не нашел ожидаемый индикатор " - " при разборе коллекции блоков в строке 3 столбец 3
вот допустимый синтаксис:
language: python
before_script:
- |
true
# Some comment.
true
вышеуказанный вопрос особенно происходит при редактировании файлов в Vim, который делает отступы комментарии заставляют их начинать с самого начала.