入門

パート 11

順番実行からワークフローへ:`.lil` に判断させる

答えがいつも「Aをして、次にB、次にC」で済むうちは線形スクリプトが最適です。ディレクトリがあるか確かめる、パスを再利用する、結果を取得する、意味のある理由で止める必要が出た瞬間、それは一覧ではなくワークフローになります。

作業に合う最小の自動化言語を使う

#lil で始まるファイルは Core の線形実行機構を使います。通常のコマンドを順番に実行するだけで、その単純さ自体が長所です。セットアップ一覧、再現可能な診断、短い手順に向いています。

run はその次の層です。変数、条件、取得した出力、入れ子スクリプト、明示的な失敗方針を追加します。三行の手順をすべてプログラムへ書き換える必要はありません。ワークフローが本当に状態や判断を必要としたときだけ run へ進みます。

install run
help run

変数はコピーされたパスを「意味のある名前」に変える

set root lil-playground はパスに役割を与えます。その後の $root$source$archive は値の意味を示し、同じリテラルを五か所で編集する必要をなくします。

分かりやすい変数名はスクリプトを移植しやすくします。環境固有の値は冒頭付近へまとめ、秘密情報は外に置き、巧妙な文字列の組み立てより少数の明快な変数を選びます。

まずこの内容でファイルを作ります
set root lil-playground
set source lil-playground/project
set archive lil-playground/project.zip

条件は前提を守るために使う

if dir "$source" は飾りではありません。アーカイブ手順が誤った対象へ黙って作用するのを防ぎます。条件が最も価値を持つのは、守らなければ破壊的または分かりにくい失敗になる前提の周りです。

runexistsfilediremptyeqneokfailcommand を持ち、反転には not を使えます。各パスの理由を読者が追える程度に分岐を短く保ちます。

まずこの内容でファイルを作ります
if dir "$source"
    stat "$source"
else
    stop "Project directory is missing"
end

次の判断が結果に依存するときだけ出力を取得する

capture name <command> は通常の lil-terminal コマンドを実行し、そのテキスト結果を変数に保存します。$last$status$cwd$line などの組み込み変数から、よく使う実行状態を参照できます。

できるからといって何でも取得しないでください。ターミナルのテキスト結果は、小さく安定しているときに便利です。ツール間や時間をまたいでデータを残す必要があるなら、構造化ファイルや専用形式のコマンドの方が適しています。

まずこの内容でファイルを作ります
capture current pwd -s
if empty "$current"
    stop "Current directory is unavailable"
end

自動化する前に「失敗」の意味を決める

run は既定で、どれか一つのコマンドが失敗するとワークフローを停止します。-k は失敗後も続行するため、互いに独立した手順が本当に続行可能な処理にだけ使います。stop なら人に分かる理由を付けて終了できます。

慣れていないワークフローはまず -n で確認します。この予行実行ではコマンドを実行せず、構文と展開結果を検証できます。その後 -v を使えば実際の実行内容を詳しく確認できます。プレビューは、自動化を理解できる状態に保つための手段です。

run workflow.lil -n
run workflow.lil -v

大きなワークフローは行数ではなく責務で分ける

ワークフローは同じ変数文脈で run child.lil を実行できるため、バックアップ、検証、展開手順を独立・再利用可能に保てます。入れ子は浅くし、一つのファイルには一つの目的を与えます。

run -p は転送用のチェックサム付き圧縮表現を作ります。圧縮済み .lil は暗号化ではありません。偶発的な編集を検出するための形式・完全性保護であり、機密性や作成者の身元を証明するものではありません。

run -p workflow.lil workflow.packed.lil
run workflow.packed.lil

自動化は意図的に対話型利用者より権限が少ない

対話型 UI コマンドは通常のワークフローでは実行できません。また、phpses のような権限の強い非対話型コマンドには明示的な -x が必要です。対話時に便利な @command の自動インストールも、run スクリプト内では無効です。

この制限は意図的です。再現可能なワークフローでは、実行前にモジュール依存関係を明示し、予期せずコードを導入したり、秘密情報の入力欄を出したり、実行途中でターミナル自体を破壊したりしないようにします。

スクリプトとして残す

これを workflow.lil として保存します。成功パスを試すなら lil-playground/project ディレクトリを作り、最初は run workflow.lil -n で実行します。重要なのは、アーカイブを作る前にスクリプトが前提を検証している点です。

set root lil-playground
set source lil-playground/project
set archive lil-playground/project.zip

if not dir "$root"
    stop "lil-playground is missing"
end

if dir "$source"
    capture current pwd -s
    zip "$source" "$archive" -f
    stat "$archive"
else
    stop "Project directory is missing"
end