YAML の複数行文字列とは?解説
YAML の複数行文字列は、複数行にまたがるテキストを書ける block scalar で、改行を保持するか空白に畳み込むかを制御します。
遅かれ早かれ workflow のステップは複数行のスクリプトを必要とし、そこで YAML の block scalar が登場します。YAML は長いテキストを多くの行にまたがって書くためのいくつかのスタイルを提供し、それらの選択が改行が生き残るかを決めます。これを正しくすることが、動く shell スクリプトと、1 つの壊れた行に潰れるスクリプトの違いです。
複数行文字列とは何か
YAML の複数行文字列、つまり block scalar は、クォートの代わりに先頭のインジケータを使って 1 つの値が複数行にまたがることを可能にします。テキストはキーの下でインデントされている限り続きます。これが、shell スクリプト全体や長いメッセージを 1 つの YAML 値として埋め込む方法です。
literal と folded
literal スタイル(pipe 文字)は、書かれたとおりにすべての改行を正確に保持します。これは改行がコマンドであるスクリプトに欲しいものです。folded スタイル(greater-than 文字)は行を空白でつなぎ、ブロックを 1 つの長い行に変えます。散文には良いですが、スクリプトには誤りです。
chomping インジケータ
末尾の修飾子が最後の改行を制御します。素のブロックは末尾の改行を 1 つ保持し、マイナスは末尾の改行を取り除き(clip 対 strip)、プラスはすべてを保持します。これらの細部はスクリプトではめったに重要ではありませんが、値の正確なバイトが重要な場合には重要になり得ます。
CI における複数行文字列
最も一般的な用途は複数行の run ステップです。各行が別々のコマンドになるよう、スクリプトを literal ブロックの下に書きます。ここで folded スタイルを使うのは古典的なバグで、コマンドが 1 行に潰れて実行され、紛らわしい形で失敗します。
# A multi-line run step using a literal block
steps:
- run: |
echo "building"
npm ci
npm run buildLatchkey に関する注記
複数行の run ステップは Latchkey runner でも同じように振る舞うため、既存の literal ブロックのスクリプトは、GitHub ホスト runner とまったく同じように 1 行ずつ実行されます。
重要なポイント
- YAML の複数行文字列(block scalar)は、1 つの値が複数のインデントされた行にまたがることを可能にします。
- literal スタイル(pipe)は改行を保持し、folded スタイル(greater-than)は行を空白でつなぎます。
- CI では、各行が別々のコマンドのままになるよう、複数行の run スクリプトを literal ブロックとして書きます。