メインコンテンツにスキップ

2件の投稿件の投稿が「dotfiles」タグ付き

すべてのタグを見る

chezmoiを最大限に活用する方法

· 8分の読み時間
Haril Song
Owner, Software Engineer at 42dot

前回の記事に続いて、chezmoiをより効果的に活用する方法をいくつか紹介します。

情報

現在使用している設定はこちらで確認できます。

使い方

chezmoiのコマンドの使い方はchezmoi helpや公式ドキュメントで確認できますが、この記事ではchezmoiをより便利に使うための高度な方法を説明します。

設定

chezmoiは設定ファイルとして~/.config/chezmoi/chezmoi.tomlを使用します。ツール固有の設定が必要な場合、このファイルに定義できます。tomlだけでなく、yamljsonもサポートしているので、慣れた形式で記述できます。公式ドキュメントではtomlを使っているので、ここでもデフォルトとしてtomlを使って説明します。

マージツールとデフォルトエディタの設定

chezmoiのデフォルトエディタはviです。私は主にnvimを使っているので、デフォルトエディタをnvimに変更する方法を紹介します。

chezmoi edit-config
[edit]
command = "nvim"

[merge]
command = "nvim"
args = ["-d", "{% raw %}{{ .Destination }}{% endraw %}", "{% raw %}{{ .Source }}{% endraw %}", "{% raw %}{{ .Target }}{% endraw %}"]

VScodeを使っている場合は、次のように設定できます:

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

テンプレートを使ったgitconfigの管理

一部の設定を統一するのではなく、環境ごとに異なる設定が必要な場合があります。例えば、仕事用と個人用で異なるgitconfig設定が必要な場合です。このように特定のデータだけを分けたい場合、chezmoiではテンプレートという方法を使って環境変数を注入することができます。

まず、gitconfigファイルを作成します:

mkdir ~/.config/git
touch ~/.config/git/config

gitconfigをテンプレートとして登録し、変数の使用を可能にします:

chezmoi add --template ~/.config/git/config

データの置換が必要な部分を記述します:

chezmoi edit ~/.config/git/config
[user]
name = {% raw %}{{ .name }}{% endraw %}
email = {% raw %}{{ .email }}{% endraw %}

これらの中括弧はローカル環境で定義された変数で埋められます。デフォルトの変数リストはchezmoi dataで確認できます。

変数をchezmoi.tomlに記述します:

# `chezmoi edit-config`の代わりにローカル設定を記述します。
vi ~/.config/chezmoi/chezmoi.toml
[data]
name = "privateUser"
email = "private@gmail.com"

これらをすべて記述した後、chezmoi apply -vnchezmoi init -vnを使って、テンプレート変数がデータ値で埋められたconfigファイルが生成されるのを確認してみてください。

自動コミットとプッシュ

chezmoi editでdotfilesを編集するだけでは、ローカルリポジトリのgitに変更が自動的に反映されません。

# 手動で行う必要があります。
chezmoi cd
git add .
git commit -m "update something"
git push

このプロセスを自動化するには、chezmoi.tomlに設定を追加する必要があります。

# `~/.config/chezmoi/chezmoi.toml`
[git]
# autoAdd = true
autoCommit = true # add + commit
autoPush = true

ただし、プッシュも自動化すると、機密ファイルが誤ってリモートリポジトリにアップロードされる可能性があります。したがって、個人的にはコミットまでの自動オプションのみを有効にすることをお勧めします

Brewパッケージの管理

仕事で便利なツールを見つけたら、個人環境にもインストールするのを忘れないようにしましょう。chezmoiで管理しましょう。

chezmoi cd
vi run_once_before_install-packages-darwin.sh.tmpl

run_once_はchezmoiが使用するスクリプトキーワードで、一度も実行されていない場合にのみスクリプトを実行したいときに使用します。before_キーワードを使用することで、dotfilesを作成する前にスクリプトを実行できます。これらのキーワードを使用して記述されたスクリプトは、次の2つの場合に実行されます:

  • 初回セットアップ時(これまでに一度も実行されていない場合)
  • スクリプト自体が変更された場合(更新)

これらのキーワードを使用してbrew bundleをスクリプト化することで、すべての環境で統一されたbrewパッケージを持つことができます。以下は私が使用しているスクリプトです:

# MacOSでのみ実行
{% raw %}{{- if eq .chezmoi.os "darwin" -}}{% endraw %}
#!/bin/bash

PACKAGES=(
asdf
exa
ranger
chezmoi
difftastic
gnupg
fzf
gh
glab
htop
httpie
neovim
nmap
starship
daipeihust/tap/im-select
)

CASKS=(
alt-tab
shottr
raycast
docker
hammerspoon
hiddenbar
karabiner-elements
obsidian
notion
slack
stats
visual-studio-code
warp
wireshark
google-chrome
)

# Homebrewがインストールされていない場合はインストール
if test ! $(which brew); then
printf '\n\n\e[33mHomebrewが見つかりません。 \e[0mHomebrewをインストールします...'
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
else
printf '\n\n\e[0mHomebrewが見つかりました。続行します...'
fi

# Homebrewパッケージを更新
printf '\nHomebrewの更新を開始します...\n'
brew update

printf '\nパッケージをインストールしています...\n'
brew install ${PACKAGES[@]}

printf '\n\n古いパッケージを削除しています...\n'
brew cleanup

printf '\n\ncaskアプリをインストールしています...\n'
brew install --cask ${CASKS[@]}

{% raw %}{{ end -}}{% endraw %}

shに詳しくなくても、それほど難しくないはずです。brew installでインストールするパッケージのリストをPACKAGESに、brew install --caskでインストールするアプリケーションのリストをCASKSに定義します。インストールプロセスはスクリプトによって実行されます。

スクリプト化はchezmoiの機能の中でも比較的複雑な機能です。適用方法はさまざまで、同じ機能を異なる方法で定義することもできます。詳細な使用方法については、公式ドキュメントを参照してください。

結論

この記事では、前回の記事で説明した基本的な使い方に続いて、便利なchezmoiの設定をまとめました。最後に紹介したスクリプトの使用は、基本設定のタイトルに反してやや複雑に見えるかもしれませんが、一度適用すれば非常に便利に使えるようになります。

参考

Chezmoiでドットファイルを便利に管理する方法

· 12分の読み時間
Haril Song
Owner, Software Engineer at 42dot

新しいMacBookを手に入れた後、開発環境を再設定することに圧倒されたことはありませんか?または、仕事中に素晴らしいツールを見つけたけれど、自宅の個人環境で再設定するのが面倒だと感じたことはありませんか?設定をGitHubにプッシュするのをセキュリティの懸念からためらったことはありませんか?

複数のデバイスを使用している場合、これらのジレンマに直面したことがあるかもしれません。異なるプラットフォーム間で設定を一貫して管理するにはどうすれば良いのでしょうか?

問題

さまざまなソフトウェアの設定ファイル(例:.zshrc)は、$HOME(ルート)を含む異なるパスに散在しています。しかし、これらのファイルをバージョン管理するためにルートでGitを設定するのは大変です。広範囲にわたるスキャンが実際にはファイル管理をさらに難しくすることがあります。

仕事用のMacBook、自宅のiMac、個人用のMacBookの3つのデバイスで一貫した開発環境を維持するのは、ほぼ不可能に思えました。

仕事中にVimのショートカットを1つ変更しただけで、仕事が終わった後に他の2つのデバイスでも同じ変更をしなければならないことに気づく... 😭

Apple Silicon時代の到来により、Intel Macと新しいデバイスとの間の大きな違いが、一貫した環境を実現するのをさらに難しくしました。仕事で頻繁に使用するエイリアスを自宅のマシンで設定するのを忘れることが多かったため、この問題について長い間考えていました。

この問題を解決するために試した方法のいくつかは次のとおりです:

  1. ドットファイルを特定のフォルダーに集中させ、Gitプロジェクトとして管理する

    1. ドットファイルの場所はさまざまです。ほとんどの場合、ルートにない場合でも事前に定義された場所があります。
    2. Gitが設定されたフォルダーで直接作業することはできず、他のデバイスにコピー&ペーストする必要があります。
  2. シンボリックリンク

    1. 新しいデバイスでセットアップするには、すべてのファイルのシンボリックリンクを正しい場所に再作成する必要があります(...)。管理するファイルが多い場合、これは面倒な作業です。
    2. 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

ここまでのプロセスを視覚化すると、次のようになります:

image

別のデバイスで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

このプロセスを視覚化すると、次のようになります:

image

初期化時に2台目のデバイスで必要なすべての手順を適用することもできます...!この機能は、2台目のデバイスが新しく購入したものである場合に非常に便利です。

chezmoi init --apply https://github.com/$GITHUB_USERNAME/dotfiles.git

リポジトリ名をdotfilesにすることをお勧めした理由は、リポジトリがdotfilesという名前であれば、前述のコマンドの短縮版を使用できるからです。

chezmoi init --apply $GITHUB_USERNAME

image

本当に便利です...🥹 2023年に発見された最高のオープンソースツールの1つになると信じています。

結論

chezmoiは非常に良く文書化されており、活発に開発されています。Golangで開発されているため、非常に高速に感じます 😄。シェルスクリプトの知識があれば、高度に自動化されたプロセスを実装し、複数のデバイス間で設定にほとんど介入する必要のない環境を作成できます。

この記事では、chezmoiの基本的な使い方を紹介しました。次の記事では、chezmoiの設定ファイルの管理とセキュリティの維持について詳しく説明します。

情報

私の設定に興味がある場合は、こちらで確認できます。

参考文献