Skip to main content

.dotfiles で管理したい

Kiai
@Ningensei848

新生活に浮かれてこういう私用ノートPCを買ってしまった。 ので、色々と設定していかないといけない。

ここ最近はバ先に貸与された Mac Book Pro だったので何も考えていなかったが、いざwin11に触れると進化がすごい。 そしてそれはそれとしてコマンドプロンプトがクソ、PowerShellは我が道を行きすぎィ! という経緯もあり、早々に諦めてWSL2(Ubuntu)に手を出すこととする。 もちろんまっさらはじめから、ということで、作業記録を残しつつ「どうすればPCの式年遷宮を乗り越えていくか」という視点で考えたい。

The numbat is a testament that those from humble beginnings can make their mark on the world.

必要なものを考える

Windows Terminal も使えて楽し~~という気分はさておき、WSL2 (Ubuntu 24.04 LTS1) までは導入済みという前提で進める。

まず、shell をどうするかについて、これは特にこだわりなければ zsh を導入するのがいいと考えている。 面倒なら bash のままでもいいのだが、カスタマイズせにゃあな~~という気持ちもあり、どうせやるなら zsh の波に乗ったほうがいいと考えた。

他には、当然 git, python, node あたりが必要になるが、git は Ubuntu 備え付けだし、ほか2つは管理ツールを使いたい…… という事情もあり、話題の ryevolta (奇しくも両方が Rust 製)を扱ってみることとする。

あと現時点で考えうるのは Rust や Docker の実行環境とか、GCP, AWS, Azure あたりの CLI とか、CUI Editor とか、そのへんだろうか。

(書きつつ思い出したが、大学時代の Google Workspace を GW 中に引っ越しせねばならないのであった…… 容量制限をあとから課す措置を下す行為になんらかの罰則を制定してほしい……)

Zsh (with Oh my Zsh)2

Zsh is a shell designed for interactive use, although it is also a powerful scripting language.

Ubuntu の場合、 apt ないし apt-get でどうにかするのがいいようだ。 前者はインタラクティヴ、後者はスクリプト向けということで、ワンライナーで書くと以下の通り:

sudo apt-get -y update && \
sudo apt-get -y upgrade && \
sudo apt-get -y install zsh && \
zsh --version && chsh -s $(which zsh) && \
echo $SHELL && $SHELL --version

再度シェルを起動し直すと、 bash ではなく zsh に切り替わっている。 初回起動時には色々設定をする必要があるが、内容をよく見て選択すること。


追記: 2024-05-01

後日に再検討したところ、「いまから新しく始める」のなら sheldon がよいという結論に至った。 見た目の方は Starship で調整する。 いずれも Rust 製であり、速度や信頼も申し分ないしサイコーな予感が溢れている。 GW 中にこれらのカスタマイズができると嬉しいが……?

当時は若く、oh-my-zsh しか知りませんでした(ぇ

zsh をカスタマイズしやすくするフレームワークとして Oh my Zsh がある。 これもついでに入れてみる。

sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

だいぶ見栄えと雰囲気が良くなった気がする。 これをいい感じにカスタマイズしていくのだが、今は取り敢えず放置。 一旦区切りにして次へ行こう。

rye

Rye: a Hassle-Free Python Experience

Rye is a comprehensive project and package management solution for Python. Born from its creator's desire to establish a one-stop-shop for all Python users, Rye provides a unified experience to install and manages Python installations, pyproject.toml based projects, dependencies and virtualenvs seamlessly. It's designed to accommodate complex projects, monorepos and to facilitate global tool installations.

cf. https://rye-up.com/guide/installation/

pyenv, virtualenv, venv, conda, pipenv, poetry 等々、Python の仮想環境を管理しようとする試みは多々あったが、現状の最新&最速3のツールは rye であるらしい4。 これも簡単にインスコできるし、"zsh completion" (自動補完)もついてくるようなのでサクッと入れてしまおう。

curl -sSf https://rye-up.com/get | bash && \
echo 'source "$HOME/.rye/env"' >> ~/.zprofile && \
source ~/.zprofile && \
echo $ZSH_CUSTOM && \
mkdir $ZSH_CUSTOM/plugins/rye && \
rye self completion -s zsh > $ZSH_CUSTOM/plugins/rye/_rye

取り敢えず使えるようにはなったはずだが、いかんせん使い方がまだまだよくわからない。 設定方法等も踏まえて再度備忘録的な記事を書いておく必要がありそうだ(GW中に書くかな?)。

volta

The Hassle-Free JavaScript Tool Manager

⚡ Fast
Install and run any JS tool quickly and seamlessly! Volta is built in Rust and ships as a snappy static binary.

⚡ Reliable
Ensure everyone in your project has the same tools—without interfering with their workflow.

⚡ Universal
No matter the package manager, Node runtime, or OS, one command is all you need: volta install.

cf. https://volta.sh/

nvm, nodenv, nodebrew, n, fem 等々、 node.js を管理しようとする試みはたくさんある。 この中だと nvm が昨今だと強いかもしれない。 だが、volta はそんな状況に一石を投じる管理ツールだ。 Rust 製なのでかなり速いし、OS の差異を意識しなくていいし、何より package.json 一つで npm / yarn 等も含めて管理できてしまう。

curl https://get.volta.sh | bash && \
source ~/.zshrc && \
echo $ZSH_CUSTOM && \
mkdir $ZSH_CUSTOM/plugins/volta && \
volta completions zsh -o $ZSH_CUSTOM/plugins/volta/_volta

……まぁまだ触れる機会が少ないので他人の受け売りなのだが。

.dotfiles という概念

そもそもとして、「実は理解が甘いのでは?」と考えたので、一応拙速に調べ直してみた。


まとめると、以下の3点が .dotfiles を作成する上で重要な要素となる:

  1. リポジトリとして管理する
  2. 育てる! = 継続的に運用する
  3. 再利用しやすくしておく

これらの観点を意識して、自分だけのカスタマイズをやってみよう。 作業の記録を次の章から残しておくこととする。

やってみよう

色々と探してみたが、上記3点をもっとも満たしやすそうなのは一つだけだった。 すなわち、dotfiles の管理ツールとして Go-lang 製の chezmoi を採用する。 いちいちシンボリックリンクを貼るとかインストールスクリプトを書くとかやってられないからだ。 そのへんを全部サポートしてくれることを期待して、次のようにインストールする:

sh -c "$(curl -fsLS get.chezmoi.io)" -- -b $HOME/bin && \
echo '# chezmoi\npath+=("$HOME/bin")\n' >> ~/.zshrc && \
source ~/.zshrc && which chezmoi && chezmoi --version && \
echo $ZSH_CUSTOM && mkdir $ZSH_CUSTOM/plugins/chezmoi && \
chezmoi completion zsh --output=$ZSH_CUSTOM/plugins/chezmoi/_chezmoi

こうして chezmoi をダウンロードし、ついでに PATH も通した(~/.zshrc に追記した)。 次に、chezmoi init することで ~/.local/share/chezmoi 直下に dotfiles を管理するためのリポジトリが作られる。

ここで注意したいのは、既に dotfiles リポジトリが存在している場合、それを引き継げるということだ。 例えば、俺はすでに5年前に自分用の dotfiles を作成していた。 (全く記憶にないが……) 今回はこれを引き継ぐ形で(ほぼぶっ壊しだろうが)進めていくこととする。

export GITHUB_USERNAME="Ningensei848" && \
chezmoi init $GITHUB_USERNAME --ssh

Quick Start にもある通り、おおよその流れは以下の通り:

  1. chezmoi add $FILE_NAME ... ファイルをコピーして管理下に置く
  2. chezmoi edit $FILE_NAME ... リポジトリ下にあるファイルを開く
  3. chezmoi -v apply ... 変更を元のファイルに反映する

chezmoi add したファイルは、Prefix として dot_ が付与される。 vscode 等のエディタで開いたときは、この名前のファイルを編集すればいい。 いくつかファイルを編集したら、その変更をリポジトリにコミットせねばならない。 このとき、chezmoi cd とすることで ~/.local/share/chezmoi に移動できる。 そのまま chezmoi diff 等で変更点を確認したら、chezmoi git --add して chezmoi git --commit した後に、chezmoi git --push してやればよい。

(これは「もしコマンドでやるなら」という話であって、ファイルの編集や Git の操作等は VSCode から GUI 経由でやっても構わない。 最終的に、変更履歴を元ファイル、つまり dot_file ではなく .file に反映するために、 chezmoi -v apply というコマンドを実行せねばならないというだけの話である)

また、困ったときは chezmoi help とか、 chezmoi doctor あるいは chezmoi status とやればよい。 自ずと何をどうすればいいかわかるだろう。

Chezmoi Daily commands

できた

というわけで、実際に作成したのが こちら

まだ慣れていない+そもそも全然カスタマイズしていないというのもあり、「継続的に運用する」という目標は未達となった…… 😿 とはいいつつ、GitHub Actions 上で異なる OS ごとに実行できるか確認するような CI/CD 処理を書けばいいだけだ。 余裕が生まれてからサクッと追記したい。

それに乗せらられば、最後の「再利用しやすく」という目標も自然とクリアできることになる。 どんな環境であれ、Chezmoi がインストールできれば、chezmoi init --apply $GITHUB_USERNAME で即座に使い始められるはずだ。 もっとも、OS ごとに使えるシェルの差異を埋めるためにもう一捻り必要になるかもしれないが(や窓ク)。

おわりに

気づけば GW も3日過ぎてしまった。 3月~4月とほとんどこういう稼働ができなかったことでそこかしこが錆びついている感じだ。

他にも GW 中に済ませねばならないことがたくさんある。 具体的には Google Project の式年遷宮とか…… (組織に紐づいているものを別の組織に移す;頭が痛い作業が残っている)

明日は平日ということで、本来は仕事があるはずのところ、年次休暇を頂いている (というか強制的に3日分取得させられている;教育の日程上仕方ないのだが)。 明日こそはもっと有意義に時間を過ごせるようにしたい…

やっていきましょう、気合でなんとかします

Footnotes

  1. The Coronation of a New Mascot: Noble Numbat | Ubuntu

  2. cf. https://github.com/ohmyzsh/ohmyzsh/wiki/Installing-ZSH

  3. uvとpipの仮想環境構築速度の比較

  4. Rye uv おっかけ 202403