web-dev-qa-db-ja.com

YAML構文エラーを修正する方法:ブロックの解析中に予期される「-」インジケータが見つかりませんでしたか?

Pythonライブラリ。 lint.travis-ci.org )を使用して記述された.travis.ymlにいくつかのコードがあります。私の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

YAMLファイルのインデントを修正するautopep8のようなツールがあれば素晴らしいでしょう。

17
Himanshu Mishra

ファイルに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作業コードを取得し、インデントの一貫性を確保します(TABを置き換え、レベルごとに常に同じインデント)。Python構文エラーのあるコードのコード再インデント、機能しないか、結果が正しくない可能性があります。

YAMLのReindenterも同じ問題に直面します。入力が意味をなさない場合の対処方法(そして、あなたと私にとって明らかなことは、プログラムにとって常に明確ではありません)。十分に解析されないすべてを複数行のスカラーにするだけでは、一般的な解決策ではありません。

それとは別に、ほとんどのYAMLパーサーは、EOLコメント、手作りのアンカー名、マッピングキーの順序など、再インデントによって失われないように、ファイルの読み取りに関する情報をいくつか捨てます。すべて要件に違反することなく仕様で。

(正しい)YAMLを均一にインデントする場合は、[ruamel.yaml][2]パッケージの一部である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; # For the installati ...

残念ながら、エラーを見つけるのにそれほど役立つものではありません。正しい.travis.ymlバージョンyaml round-trip .travis.ymlを実行すると、2回目のラウンドトリップで安定することがわかります(つまり、最初の余分な空白が失われます)。そして、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コメントではないことに注意してください。これは、複数行の文字列の一部にすぎません。ただし、最初の行の前または最後の行の後のコメントは保持されます。

7
Anthon

エラーは構文エラーを意味し、これは追跡が困難です。複数のこと、二重引用符の欠落を含む間違ったインデント、または特殊文字を二重引用符で囲む必要があることを意味するためです。

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')"

したがって、POST毎回travisを介してコードを作成する必要はありません。これは Travis WebLint と同様に機能します。


次の構文は正しくありません。

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

コメントは次のように間違ったインデントを持っているため:

[x]構文エラー:():行3列3のブロックコレクションの解析中に予期される「-」インジケータが見つかりませんでした

有効な構文は次のとおりです。

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

上記の問題は、Vimでファイルを編集するときに特に発生します。これは、コメントのインデントを行って、ファイルを最初から開始します。

5
kenorb