[[dotfiles]] の `setup.sh` でパッケージをインストールするとき、スクリプト内に手続き的なコードを書くのではなく、宣言的な設定ファイル (リスト) に分離する。
## 問題: 手続き的なコードは冗長になる
```bash
# setup.sh にパッケージが増えるたびにコードが増える
if ! brew list zsh-autosuggestions &> /dev/null; then
brew install zsh-autosuggestions
fi
if ! brew list fzf &> /dev/null; then
brew install fzf
fi
```
## 解決策: 設定ファイルに分離
**`Brewfile`(何をインストールするか):**
```ruby
brew "zsh-autosuggestions"
brew "fzf"
```
**`setup.sh`(どうインストールするか):**
```bash
brew bundle --file="$DOTFILES_DIR/Brewfile"
```
## メリット
| 観点 | 手続き的 | 宣言的 |
|------|----------|--------|
| 可読性 | ロジックに埋もれる | 一覧で見える |
| 変更時 | コードを編集 | リストに 1 行追加 |
| 責任 | 混在 | 分離 (何を / どうやって) |
## 関連ノート
- **[前提]** [[dotfiles リポジトリはシンボリックリンクで設定ファイルを管理する]]: 本ノートの宣言的管理はこの運用の上に積む工夫
- **[派生]** [[dotfiles ではパスをハードコードせず環境変数を使う]]: 本ノートの宣言的管理と並ぶ、dotfiles のポータビリティ向上策
- **[派生]** [[R はツールをグローバルにインストールし、分析ライブラリは renv で管理する]]: 同じ宣言的管理パターンを R 言語のグローバルパッケージに適用した別ドメインの例