順番実行からワークフローへ:`.lil` に判断させる
答えがいつも「Aをして、次にB、次にC」で済むうちは線形スクリプトが最適です。ディレクトリがあるか確かめる、パスを再利用する、結果を取得する、意味のある理由で止める必要が出た瞬間、それは一覧ではなくワークフローになります。
作業に合う最小の自動化言語を使う
#lil で始まるファイルは Core の線形実行機構を使います。通常のコマンドを順番に実行するだけで、その単純さ自体が長所です。セットアップ一覧、再現可能な診断、短い手順に向いています。
install runhelp 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" は飾りではありません。アーカイブ手順が誤った対象へ黙って作用するのを防ぎます。条件が最も価値を持つのは、守らなければ破壊的または分かりにくい失敗になる前提の周りです。
exists、file、empty、eq、ne、ok、fail、command を持ち、反転には 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自動化する前に「失敗」の意味を決める
stop なら人に分かる理由を付けて終了できます。
慣れていないワークフローはまず -n で確認します。この予行実行ではコマンドを実行せず、構文と展開結果を検証できます。その後 -v を使えば実際の実行内容を詳しく確認できます。プレビューは、自動化を理解できる状態に保つための手段です。
run workflow.lil -nrun workflow.lil -v大きなワークフローは行数ではなく責務で分ける
ワークフローは同じ変数文脈で
.lil は暗号化ではありません。偶発的な編集を検出するための形式・完全性保護であり、機密性や作成者の身元を証明するものではありません。
run -p workflow.lil workflow.packed.lilrun workflow.packed.lil自動化は意図的に対話型利用者より権限が少ない
対話型 UI コマンドは通常のワークフローでは実行できません。また、@command の自動インストールも、
この制限は意図的です。再現可能なワークフローでは、実行前にモジュール依存関係を明示し、予期せずコードを導入したり、秘密情報の入力欄を出したり、実行途中でターミナル自体を破壊したりしないようにします。
スクリプトとして残す
これを workflow.lil として保存します。成功パスを試すなら lil-playground/project ディレクトリを作り、最初は
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