chezmoi の使い方について書いた記事一覧は以下です。
[基本編] | [テンプレート機能編] (この記事) | [ファイル暗号化機能編]
chezmoi で個人設定ファイルを同期していると、
- こちらのマシンとあちらのマシンでこの箇所を変えたい。
-
この箇所は GitHub リポジトリに入れるときは伏せておきたい。
- なお、公開したくない情報を含むファイルは、ファイルごと暗号化してコミットする手もあります (この記事では扱いません → 別記事にしたので冒頭リンクを参照)。
ということもあると思います。これらは chezmoi のテンプレート機能を使って、ローカルで変数を注入するようにすれば解決できます。やり方は以下のドキュメントにあります。
Manage machine-to-machine differences - chezmoi
この記事は上記ドキュメントと同じ内容ですが、手順に区切って見出しを付けています。
- 【手順1】 各マシンに設定ファイルを生成して、ローカルで注入したい変数を登録する
- 【手順2】 ローカルで注入したい変数を含むファイルをテンプレートとしてソースディレクトリに登録した上で、テンプレートにくり抜く
- 【手順3】 (おまけ) 通常のファイルのようにソースディレクトリからローカルに反映し、変数が注入された状態で反映されるか動作確認する
なお、以下では自作ランチャー ~/launcher.html に、そのマシンで利用する Slack ワークスペース ID にしたい箇所があるものとしています。
const slackUrl = 'https://app.slack.com/client/{{ .slackWorkSpaceId }}';
【手順1】 各マシンに設定ファイルを生成して、ローカルで注入したい変数を登録する
この手順はスキップできる場合があります: コマンド chezmoi data で、既に登録済みのそのマシンの変数 (アーキテクチャやホスト名、ユーザ名など) が表示されます。それらの変数はドット区切りの各階層キー (先頭にもドット) で {{ .chezmoi.arch }} や {{ .chezmoi.hostname }} のように引き出せます。以下のようにテンプレートを実行してみて、登録したい変数を引き出せるなら自分で登録しなくてよいです。
chezmoi execute-template '{{ .chezmoi.arch }}'
# -> amd64
chezmoi execute-template '{{ .chezmoi.hostname }}'
# -> MyComputer
chezmoi execute-template '{{ .chezmoi.username }}'
# -> MYCOMPUTER\Cookie # Windows の場合
chezmoi execute-template '{{ (splitList "\\" .chezmoi.username) | last }}'
# -> Cookie
# ※ 補足:
# chezmoi は Go の text/template を使っていてテンプレート内で sprig 関数が使えます
# https://masterminds.github.io/sprig/
# {{ (splitList "\\" .chezmoi.username) | last }} は .chezmoi.username を
# バックスラッシュ (エスケープ付きで \\) で分割して最後の要素を取ります
まず、ローカルで注入したい変数を記入する設定ファイル ~/.config/chezmoi/chezmoi.toml を生成します。このファイルは GitHub リポジトリには入れず、そのマシンで管理します。
vi ~/.config/chezmoi/chezmoi.toml
そして実際に適当な変数名を付けて変数を登録します。PC1 と PC2 で変えたいときは変えます (いま手元にない方のマシンでは後々作業すればよいです)。
[data]
slackWorkSpaceId = "TXXXXXXXX"
[data]
slackWorkSpaceId = "TYYYYYYYY"
上記のように変数を登録すると、以下のコマンドで "{{ .変数名 }}" で引き出せることが確認できます (しいて確認する必要はないです)。
chezmoi execute-template "{{ .slackWorkSpaceId }}"
# -> TXXXXXXXX
【手順2】 ローカルで注入したい変数を含むファイルをテンプレートとしてソースディレクトリに登録した上で、テンプレートにくり抜く
次に、ローカルで注入したい変数を含むファイルをソースディレクトリに登録しますが、このときオプション --template をつけることでテンプレートとして扱えます。
chezmoi add --template ~/launcher.html # テンプレートとしてソースディレクトリに登録
# -> ~/.local/share/chezmoi/launcher.html.tmpl にコピーされる
しかし、このままでは記入欄がないので、ちゃんと記入欄をくり抜いてテンプレートにする必要があります。ソースディレクトリ側のファイルを以下のコマンドで編集します。
chezmoi edit ~/launcher.html
# お好きなエディタで編集したいなら ~/.local/share/chezmoi/launcher.html.tmpl を直接編集
【手順1】で登録 (確認) した変数を記入する欄を、以下のようにくり抜きます。
const slackUrl = 'https://app.slack.com/client/{{ .slackWorkSpaceId }}';
これで GitHub リポジトリに登録します。もし先にテンプレートの動作確認をしたいなら、【手順3】の動作確認後に登録してください。GitHub に公開したくない情報をくり抜いた場合は、きちんとくり抜けているか GitHub 登録前によく確認してください。
# ソースディレクトリに移動
# 公式には chezmoi cd だが Windows Git Bash で chezmoi cd すると bash でなくなるのでこう
pushd ~/.local/share/chezmoi/
git status
git add launcher.html.tmpl
git commit -m "Add Launcher"
git push
popd # chezmoi cd で移動した場合は exit で元の場所に戻る
後は別マシンで【手順1】を実施した上で、通常通りのコマンドでリポジトリをプルし、ローカルとの差分を確認し、ローカルに反映するだけです。
【手順3】 (おまけ) 通常のファイルのようにソースディレクトリからローカルに反映し、変数が注入された状態で反映されるか動作確認する
この手順はおまけです。別マシンへの反映時に意図通りか確認すればじゅうぶんです。
登録したマシンで動作確認するなら、chezmoi が変数を注入してくれるのを確認するため、あえてローカルファイルの、ローカル変数が注入されるべき場所を潰してみます。
vi ~/launcher.html
# const slackUrl = 'https://app.slack.com/client/ここに注入されるかのテスト';
その上で、通常通りのコマンドでローカルに反映します。変数が注入された状態で反映されるのがわかります。
chezmoi diff # ソースディレクトリとローカルとの差分確認
# -> この時点のプレビューで変数が注入されているのがわかる
chezmoi apply # ローカルに反映
# launcher.html has changed since chezmoi last wrote it? と訊かれたら o(overwrite) と打つ
const slackUrl = 'https://app.slack.com/client/TXXXXXXXX';