Skip to content

chezmoiのprofile機能を使ったBrewfile/mise設定の環境別管理 #27

@yellow-seed

Description

@yellow-seed

目的

現在の設定はprivate PC用の設定になっているが、work PC用など環境(profile)別に異なる設定を管理できるようにしたい。特に以下の2つはprofileごとに管理する必要がある:

  • Brewfile: 会社PCではインストールしないアプリ(プライベート用SNS、ゲームなど)がある
  • mise config.toml: プロジェクトによって必要な言語・ツールのバージョンが異なる

前提

  • 現在の設定 = private PC用の設定
  • 新たにwork PC用の設定を追加する
  • 共通部分と差分を適切に管理する

chezmoiのprofile機能について

chezmoiでは、.chezmoi.toml.tmplでprofileを定義し、以下のような管理が可能:

  1. テンプレート変数でのprofile判定: {{ if eq .profile "work" }}
  2. ファイル名でのprofile指定: dot_Brewfile.tmplで条件分岐
  3. .chezmoiignoreでのprofile別除外: 特定profileでは適用しないファイルを指定

実装の段取り

Phase 1: Profile設定の追加

1.1 .chezmoi.toml.tmplの拡張

現在の設定にprofile設定を追加:

{{- $profile := "private" -}}
{{- if eq .chezmoi.hostname "work-macbook" -}}
{{-   $profile = "work" -}}
{{- else if stdinIsATTY -}}
{{-   $profile = promptString "profile (private/work)" $profile -}}
{{- end -}}

[data]
    profile = {{ $profile | quote }}

[edit]
    command = "code"
    args = ["--wait"]

判定ロジック:

  • ホスト名がwork-macbookの場合は自動的にworkプロファイル
  • それ以外でインタラクティブな環境の場合はプロンプトで選択
  • デフォルトはprivate

タスク

  • .chezmoi.toml.tmplにprofile設定を追加
  • ホスト名ベースの自動判定ロジックを実装
  • プロンプトによる手動選択機能を追加

Phase 2: Brewfileのprofile別管理

2.1 ファイル構成の設計

以下の3つのファイルで管理:

home/
├── dot_Brewfile.tmpl              # メインファイル(テンプレート)
├── dot_Brewfile_common.tmpl       # 共通設定
├── dot_Brewfile_private.tmpl      # private専用
└── dot_Brewfile_work.tmpl         # work専用

2.2 dot_Brewfile.tmplの実装

{{- if eq .profile "private" -}}
{{ include "dot_Brewfile_common.tmpl" }}
{{ include "dot_Brewfile_private.tmpl" }}
{{- else if eq .profile "work" -}}
{{ include "dot_Brewfile_common.tmpl" }}
{{ include "dot_Brewfile_work.tmpl" }}
{{- end -}}

2.3 既存Brewfileの分類

現在のdot_Brewfileを分析して以下に分類:

共通(両環境で必要):

  • 開発ツール: Docker, Git関連, VSCode, mise
  • 基本ユーティリティ: tree, 1Password
  • ブラウザ: Chrome, Brave, Firefox

Private専用:

  • SNS/コミュニケーション: Discord, LINE
  • エンターテイメント: Spotify, Kindle
  • プライベートなアプリ: Notion(個人版), Obsidian

Work専用:

  • 会社固有のツール
  • エンタープライズ版アプリ

タスク

  • 現在のdot_Brewfilecommon/private/workに分類
  • dot_Brewfile_common.tmplを作成(共通設定)
  • dot_Brewfile_private.tmplを作成(現在の設定から抽出)
  • dot_Brewfile_work.tmplを作成(初期は空または最小構成)
  • dot_Brewfile.tmplでincludeする実装
  • 既存のdot_Brewfileを削除またはリネーム

Phase 3: mise config.tomlのprofile別管理

3.1 ファイル構成の設計

home/dot_config/mise/
├── config.toml.tmpl              # メインファイル(テンプレート)
├── config_common.toml.tmpl       # 共通設定
├── config_private.toml.tmpl      # private専用
└── config_work.toml.tmpl         # work専用

3.2 設定の分類方針

共通:

  • chezmoi, gh, docker-compose(どの環境でも必要)
  • Go, Node.js, Python(バージョンはprofileで変える可能性あり)

Private専用:

  • 個人プロジェクト用の特定バージョン
  • 趣味の開発用ツール

Work専用:

  • 会社プロジェクト固有のバージョン指定
  • 業務用ツール

3.3 実装方法(案)

# config.toml.tmpl
{{- if eq .profile "private" -}}
{{ include "config_common.toml.tmpl" }}
{{ include "config_private.toml.tmpl" }}
{{- else if eq .profile "work" -}}
{{ include "config_common.toml.tmpl" }}
{{ include "config_work.toml.tmpl" }}
{{- end -}}

タスク

  • 現在のconfig.tomlcommon/private/workに分類
  • config_common.toml.tmplを作成
  • config_private.toml.tmplを作成
  • config_work.tmplを作成
  • config.toml.tmplでincludeする実装
  • 既存のconfig.tomlを削除またはリネーム

Phase 4: テストとドキュメント

4.1 テスト計画

  • private profileでのchezmoi initテスト
  • work profileでのchezmoi initテスト
  • 両profileでのchezmoi applyテスト
  • Brewfileが正しく生成されることを確認
  • mise設定が正しく生成されることを確認
  • profile切り替えテスト

4.2 ドキュメント更新

README.mdに以下のセクションを追加:

  • Profile機能の説明
  • 初期セットアップ時のprofile選択方法
  • Profile別の設定管理方法
  • Profile切り替え手順
  • Brewfile/mise設定の追加・更新フロー

4.3 GitHub Actions対応

既存のE2E Setup Testをprofile対応させる:

  • private profileでのテスト
  • work profileでのテスト(オプション)

実装順序の推奨

  1. Phase 1 → Phase 2 → Phase 3 → Phase 4の順で実施
  2. 各Phaseごとにブランチを作成してPR
  3. 最初はprivate profileのみで動作確認
  4. work profileは段階的に追加

参考リンク

注意事項

  • 既存の設定はprivate profileとして保存
  • work profileは最小構成から始めて段階的に追加
  • 共通部分は重複を避けて_commonファイルで管理
  • セキュリティ: work固有の情報は絶対に公開リポジトリにコミットしない

関連ファイル

  • home/.chezmoi.toml.tmpl
  • home/dot_Brewfile → 3つのファイルに分割
  • home/dot_config/mise/config.toml → 3つのファイルに分割
  • README.md

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions