Как исправить синтаксическую ошибку 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, который делает отступы комментарии заставляют их начинать с самого начала.