My Dev#003 dotfiles
開発環境を「育てる」
今回はdotfilesについてまとめます.
What is "dotfiles"?
Linuxに限らず,WindowsなどほとんどのOSで共通することかと思いますが,各ユーザのホームディレクトリ~ に様々なパッケージの設定ファイルが配置されており,これをドットファイルと呼びます.
基本的に.から始まる隠しファイルとして存在することが呼び名の由来です.シンプルですね.
開発者の間では,このドットファイルをdotfilesというリポジトリにまとめてgit管理することによって,再現性の高い開発環境を整えることが一般的です.
開発環境が変化しても,スタイルに合わせて長期的に自分だけの環境を「育てる」ことができることが魅力です.中華鍋みたいで大好きです.
また僕は経験がないですが,他のエンジニアが公開しているdotfilesを使えば,楽に優秀な環境を入手することができます.その逆も然りで,良いdotfilesを作成できれば他の方に使ってもらうことができるかもしれません.
僕としては,プログラミングやPCに触れる機会が多い人には是非おすすめしたいです.PCを触るのが結構楽しくなります.
Repository
僕のリポジトリです.興味があれば是非覗いてください.まだまだ発展途上なので,有識者がおられたらアドバイスをいただけると嬉しいです.
https://github.com/a-hashioka/dotfiles
.
├── .gitignore
├── bin
│ ├── init_env.sh
│ ├── install.sh
│ └── stow.sh
├── fastfetch
│ └── .config
│ └── fastfetch
│ └── config.jsonc
├── ghostty
│ └── .config
│ └── ghostty
│ └── config.ghostty
├── git
│ └── .gitconfig
├── img
│ ├── fastfetch.png
│ ├── neovim_dashboard.png
│ └── neovim_editor.png
├── nvim
│ └── .config
│ └── nvim
│ ├── .neoconf.json
│ ├── init.lua
│ ├── lazy-lock.json
│ ├── lua
│ │ ├── config
│ │ │ ├── autocmds.lua
│ │ │ ├── keymaps.lua
│ │ │ ├── lazy.lua
│ │ │ └── options.lua
│ │ └── plugins
│ │ ├── colortheme.lua
│ │ ├── dashboard.lua
│ │ ├── example.lua
│ │ ├── explorer.lua
│ │ └── markdown.lua
│ └── stylua.toml
├── README.md
├── ssh
│ └── .ssh
│ └── config
└── zsh
├── .zsh
│ ├── .fzf.zsh
│ ├── .p10k.zsh
│ ├── alias.zsh
│ ├── completion.zsh
│ ├── history.zsh
│ ├── path.zsh
│ └── plugin.zsh
└── .zshrc
How to manage "dotfiles"
dotfilesの始め方を解説したいと思います.
基本的には僕が採用しているものを中心に紹介します.
GNU Stow
パッケージは~にドットファイルを参照しに行くので,dotfilesリポジトリにファイルを移動するとそのままの状態では設定を反映できません.そこで必要なのがシンボリックリンクです.
シンボリックリンクとはWindowsで言うところのショートカットのようなもので,特定のファイルやディレクトリのアドレスへの参照を任意の位置に配置することで,あたかもそこに実体が存在するかのように操作できるようにする仕組みです.
dotfilesで管理しているドットファイルのシンボリックリンクを~に配置すれば,パッケージが参照できるようになります.
管理するドットファイルが増えると,シンボリックリンクを一つ一つ設定するのはかなり手間です.また別の環境で使用することを考えると自動化が必要になります.そこでGNU Stowの出番です.
GNU Stowは,指定したディレクトリ内のフォルダ構造をそのまま模倣して,ターゲット(デフォルトではホームディレクトリ~)へ一括でシンボリックリンクを貼ってくれるディレクトリ展開リンカーです.
~/dotfiles/
├── zsh/ # パッケージ名(Stowの引数になる)
│ └── .zshrc # ドットファイル(実体)
└── nvim/
└── .config/
└── nvim/
└── init.lua
例えば上のようにdotfilesを構成するとstow zshやstow nvimを実行することでディレクトリ内部のドットファイルのシンボリックリンクを作成することができます.シンボリックリンクの作成先はデフォルトで~です.
Installer
Stowの導入により管理体制は整えることができます.しかし,別のPCで開発環境を再現する場合,そもそもパッケージ自体がインストールされていない場合もあるので,ドットファイルだけでは不十分です.
そこでInstallerが必要になります.僕の場合非常にシンプルで,必要なパッケージを一括でインストールするシェルスクリプトinstall.shをdotfiles内で管理しています.
Ubuntuでの使用しか想定していないのでaptを使用しています.
#!/bin/bash
set -euo pipefail
# ==================================
# SYSTEM PACKAGES INSTALLATION (APT)
# ==================================
echo "[*] Updating and upgrading system packages..."
sudo apt-get update && sudo apt-get upgrade -y
PACKAGES=(
### ずらっとパッケージ ###
)
echo "[*] Installing core packages..."
sudo apt-get install -y "${PACKAGES[@]}"
### PPAなど公式リポジトリ以外からのインストール ###
echo "[+] Installation completed!"
最後に
僕のdotfilesは相当単純な仕組みなので,誰でも導入できると思います.
もっと玄人感を出したいなら,パッケージ管理用のモダンなツールが沢山あるので気になる人は使ってみてください.面白いものがあったら是非教えてください.
本来真面目にやるなら以下のことを考えるべきです.
- マルチOS: どのOSでも使えること.
- 冪等性: スクリプトが初回だけでなく複数回実行された場合でも正常に実行されること.
この辺をしっかりしようとすると結構大変そうなので,僕は割と適当にやってます.管理の管理になってしまうと本末転倒なので,やはり線引きが必要ですね.