Chezmoiでドットファイルを便利に管理する方法
新しいMacBookを手に入れた後、開発環境を再設定することに圧倒されたことはありませんか?または、仕事中に素晴らしいツールを見つけたけれど、自宅の個人環境で再設定するのが面倒だと感じたことはありませんか?設定をGitHubにプッシュするのをセキュリティの懸念からためらったことはありませんか?
複数のデバイスを使用している場合、これらのジレンマに直面したことがあるかもしれません。異なるプラットフォーム間で設定を一貫して管理するにはどうすれば良いのでしょうか?
問題
さまざまなソフトウェアの設定ファイル(例:.zshrc
)は、$HOME(ルート)を含む異なるパスに散在しています。しかし、これらのファイルをバージョン管理するためにルートでGitを設定するのは大変です。広範囲にわたるスキャンが実際にはファイル管理をさらに難しくすることがあります。
仕事用のMacBook、自宅のiMac、個人用のMacBookの3つのデバイスで一貫した開発環境を維持するのは、ほぼ不可能に思えました。
仕事中にVimのショートカットを1つ変更しただけで、仕事が終わった後に他の2つのデバイスでも同じ変更をしなければならないことに気づく... 😭
Apple Silicon時代の到来により、Intel Macと新しいデバイスとの間の大きな違いが、一貫した環境を実現するのをさらに難しくしました。仕事で頻繁に使用するエイリアスを自宅のマシンで設定するのを忘れることが多かったため、この問題について長い間考えていました。
この問題を解決するために試した方法のいくつかは次のとおりです:
-
ドットファイルを特定のフォルダーに集中させ、Gitプロジェクトとして管理する
- ドットファイルの場所はさまざまです。ほとんどの場合、ルートにない場合でも事前に定義された場所があります。
- Gitが設定されたフォルダーで直接作業することはできず、他のデバイスにコピー&ペーストする必要があります。
-
シンボリックリンク
- 新しいデバイスでセットアップするには、すべてのファイルのシンボリックリンクを正しい場所に再作成する必要があります(...)。管理するファイルが多い場合、これは面倒な作業です。
- Gitよりも使用が複雑で、さまざまな詳細に注意を払う必要があります。
最終的に、Gitメソッドを使用しましたが、ルートにないファイル(~/.ssh/config
、~/.config/nvim
など)に対してのみで、ルートを使用するファイル(~/.zshrc
、~/.gitconfig
など)については部分的に諦めていました。しかし、chezmoiを発見するまでのことです!
それでは、この難しい問題をエレガントに解決するchezmoiを紹介します。
Chezmoiとは?
複数の多様なマシン間でドットファイルを安全に管理します。 - chezmoi.io
Chezmoiは、さまざまな環境やデバイス間で多数のドットファイルを一貫して管理できるツールです。公式ドキュメントに記載されているように、いくつかの設定を行うだけで「セキュリティ」を確保できます。ドットファイルがどこにあるか、どこに配置すべきかを心配する必要はありません。chezmoiに管理するドットファイルを伝えるだけで済みます。
コンセプト
この一見魔法のような偉業はどのように可能なのでしょうか? 🤔
本質的に、chezmoiはドットファイルを~/.local/share/chezmoi
に保存し、chezmoi apply
を実行すると、各ドットファイルの状態をチェックし、最小限の変更を加えて希望する状態に一致させます。詳細なコンセプトについては、リファレンスマニュアルを参照してください。
それでは、簡単に使い方を説明します。
Chezmoiの始め方
chezmoiをインストールしたら(インストールガイドはこちら)、次のコマンドで初期化を行います:
chezmoi init
この操作により、ローカルデバイスの~/.local/share/chezmoi
(作業ディレクトリ)に新しいGitリポジトリが作成され、ドットファイルが保存されます。デフォルトでは、chezmoiはローカルデバイスの作業ディレクトリに変更を反映します。
~/.zshrc
ファイルをchezmoiで管理したい場合は、次のコマンドを実行します:
chezmoi add ~/.zshrc
~/.zshrc
ファイルが~/.local/share/chezmoi/dot_zshrc
にコピーされたことがわかります。
chezmoiで管理されている~/.zshrc
ファイルを編集するには、次のコマンドを使用します:
chezmoi edit ~/.zshrc
このコマンドは、$EDITOR
で~/.local/share/chezmoi/dot_zshrc
を開いて編集します。テストのためにいくつかの変更を加えて保存します。
環境変数に$EDITOR
が設定されていない場合、デフォルトでvi
が使用されます。
作業ディレクトリでどのような変更が行われたかを確認するには、次のコマンドを使用します:
chezmoi diff
chezmoiによってローカルデバイスに適用された変更を反映するには、次のコマンドを使用します:
chezmoi apply -v
すべてのchezmoiコマンドは-v
(詳細)オプションを使用できます。このオプションは、ローカルデバイスに適用される内容を視覚的に表示し、コンソールで明確にします。-n
(ドライラン)オプションを使用すると、コマンドを適用せずに実行できます。したがって、-v
と-n
オプションを組み合わせることで、見慣れないコマンドを実行する前にどのようなアクションが取られるかをプレビューできます。
それでは、ソースディレクトリに直接アクセスし、chezmoiの内容をリモートリポジトリにプッシュしましょう。リポジトリ名をdotfiles
にすることをお勧めします。後で説明します。
chezmoi cd
git add .
git commit -m "Initial commit"
git remote add origin https://github.com/$GITHUB_USERNAME/dotfiles.git
git push
chezmoi.toml
ファイルに関連設定を書き込むことで、リポジトリの同期プロセスを自動化し、より便利に使用できます。
chezmoiの作業ディレクトリを終了するには、次のコマンドを使用します:
exit
ここまでのプロセスを視覚化すると、次のようになります:
別のデバイスでChezmoiを使用する
これがchezmoiを使用する理由です。chezmoiを使用して2台目のデバイスに内容を取得しましょう。この例ではSSH URLを使用しています。2台目のデバイスにchezmoiがすでにインストールされていると仮定します。
chezmoi init git@github.com:$GITHUB_USERNAME/dotfiles.git
特定のリポジトリで初期化することで、chezmoiは自動的にサブモジュールや必要な外部ソースファイルをチェックし、オプションに基づいてchezmoiの設定ファイルを生成します。
先ほど見たdiff
コマンドを使用して、chezmoiが2台目のデバイスにどのような変更をもたらすかを確認します。
chezmoi diff
すべての変更を適用することに満足している場合は、先ほど説明したapply
コマンドを使用します。
chezmoi apply -v
ローカルに適用する前にいくつかのファイルを変更する必要がある場合は、edit
を使用します。
chezmoi edit $FILE
または、マージツールを使用してGitマージのようにローカルの変更を適用することもできます。
chezmoi merge $FILE
chezmoi merge-all
を使用すると、マージが必要なすべてのファイルに対してマージ操作を実行できます。
これらの手順をすべて一度に実行するには、次のコマンドを使用します:
chezmoi update -v
このプロセスを視覚化すると、次のようになります:
初期化時に2台目のデバイスで必要なすべての手順を適用することもできます...!この機能は、2台目のデバイスが新しく購入したものである場合に非常に便利です。
chezmoi init --apply https://github.com/$GITHUB_USERNAME/dotfiles.git
リポジトリ名をdotfiles
にすることをお勧めした理由は、リポジトリがdotfiles
という名前であれば、前述のコマンドの短縮版を使用できるからです。
chezmoi init --apply $GITHUB_USERNAME
本当に便利です...🥹 2023年に発見された最高のオープンソースツールの1つになると信じています。
結論
chezmoiは非常に良く文書化されており、活発に開発されています。Golangで開発されているため、非常に高速に感じます 😄。シェルスクリプトの知識があれば、高度に自動化されたプロセスを実装し、複数のデバイス間で設定にほとんど介入する必要のない環境を作成できます。
この記事では、chezmoiの基本的な使い方を紹介しました。次の記事では、chezmoiの設定ファイルの管理とセキュリティの維持について詳しく説明します。
私の設定に興味がある場合は、こちらで確認できます。