利用者の設定ファイルへ書き込む管理ブロックには生成元バージョンを埋める — 「有無」判定は改訂が永久に届かない
設計判断
配布設計
CLI設計
判断
運用
CLI やインストーラが、利用者のホーム配下にある設定ファイル・指示ファイルへ開始終了マーカーで囲んだ「管理ブロック」を追記する設計はよく使う。ここで更新条件をブロックの有無だけで書くと、初回は入るが以後は二度と更新されない。提供側がブロックの中身を改訂しても、既に入っている利用者には永久に届かない。強制上書きフラグを用意していても、利用者はそのフラグを付ける動機を持たないため実質未使用になる。
判断基準
- 開始マーカーに生成元のバージョンを埋め込み、更新判定を「ブロックの有無」ではなく「埋まっているバージョンと実行中の版が一致するか」に変える。不一致なら強制フラグなしで書き換える。強制フラグは「一致していても書き直す」に意味を移す。
- 不一致判定を単純一致にするか順序比較(新しい方を優先)にするかは別の判断。単純一致は実装が軽い代わりに、古い版を明示実行するとダウングレードする。「最後に実行したものが正本」という契約なら単純一致でよいが、その非対称性はドキュメントに明記する。明記しないと、提供側の意図と利用者の期待がずれたまま静かに巻き戻る。
- 強制フラグなしの自動上書きが許されるのは、書き換え範囲がマーカーで明示された管理領域に限定され、その外の利用者記述が保全される場合。この契約は README など利用者が読む場所に書いて初めて成立する。
後方互換
バージョンを後から導入する場合、既存利用者のブロックにはバージョンが無い。検出パターンはバージョン部分を省略可能にして旧形式も拾い、初回実行時に現行バージョン付きへ移行させる。移行は1回で済み、以後は通常の不一致判定に乗る。
落とし穴
- ブロック本文を置換するとき、置換文字列をそのまま渡すと本文中の置換特殊記法が展開される言語がある。置換値を返す関数形式にすると防げる。本文にその記法が今は無くても、後から本文を編集した人が踏む。
検証方法
実際にビルドした配布物から実行して次の4通りを確認する。バージョンなしの旧ブロックが移行されること、同一バージョンでの再実行が書き換えないこと(冪等)、古いバージョンのブロックが自動更新されること、いずれの場合もブロック外の利用者記述が前後とも残ること。ユニットテストだけでなく配布物からの実走を1回入れるのは、バージョン取得元のファイルがビルド後の配置でも解決できるかを同時に確かめられるため。