巷では chezmoi が流行ってますが乗っかることもなく。
方針
mise 推しなので mise と、薄い shell,symlink だけで一旦再整理しました。
-
homebrew/linuxbrewは遅いので大部分をmiseに乗り換え。 -
brewはBrewfile,miseは~/.config/mise/config.tomlで宣言的に管理。 - macosでの
brew caskは当然継続。
mise はrust製で動作が速く、バージョンの切り替えがしやすいのがよいです。
brew
惰性で使ってるものも多く、もうちょっと削るかも。
Brewfile.common
brew "coreutils"
brew "curl"
brew "git"
brew "tree"
brew "watch"
brew "wget"
brew "fzy"
brew "git-secrets"
brew "llvm"
brew "nkf"
brew "tig"
brew "universal-ctags"
brew "mise"
Brewfile.mac
brew "duckdb"
brew "kind"
brew "kubectl"
brew "kubectx"
brew "kubernetes-helm"
brew "lima"
brew "ncurses"
brew "openssl"
brew "reattach-to-user-namespace"
brew "trash"
brew "util-linux"
brew "zsh"
cask_args appdir: "/Applications"
tap "homebrew/cask"
cask "alt-tab"
cask "appcleaner"
cask "clibor-for-mac"
cask "flux"
cask "karabiner-elements"
cask "kindle"
cask "linearmouse"
cask "macgesture"
cask "raycast"
cask "rectangle"
cask "vagrant"
cask "virtualbox"
cask "visual-studio-code"
Brewfile.ubuntu
brew "trash-cli"
mise
mise は aqua のregistryも参照可能なのでカバー範囲が広い。
registry参照に当たり aqua を実行するのではなく参照部分を自前実装しているので安定している。
また python のバージョン管理だけは uv でやったほうがdir毎の venv との関係で都合が良いのでそちらで行う。
どっかで適当に uv python pin --global 3.13 しておけば雑な普段遣いも困らない。
config.toml
[tools]
# Language runtimes (Python managed by uv)
nodejs = "lts"
go = "1.25"
bun = "latest"
# Language tools
ruff = "latest"
pnpm = "latest"
golangci-lint = "latest"
uv = "latest"
# Editor
neovim = "latest"
# CLI tools (version switchable)
ripgrep = "latest"
fzf = "latest"
fd = "latest"
bat = "latest"
eza = "latest"
gh = "latest"
ghq = "latest"
delta = "latest"
jq = "latest"
glow = "latest"
xh = "latest"
buf = "latest"
tmux = "latest"
pinact = "latest"
# CLI tools (aqua/github backend)
"aqua:Wilfred/difftastic" = "latest"
"aqua:peco/peco" = "latest"
"aqua:ynqa/jnv" = "latest"
"aqua:sxyazi/yazi" = "latest"
"aqua:rossmacarthur/sheldon" = "latest"
"github:dalance/procs" = "latest"
# npm tools
"npm:diff-so-fancy" = "latest"
"npm:@google/gemini-cli" = "latest"
"npm:@anthropic-ai/claude-code" = "latest"
[settings]
# Allow .python-version files to set python version
idiomatic_version_file_enable_tools = ["python"]
miseでのosごとの分岐には色々仕組みがあるのでそれに乗っかればOK
.config/mise/
├── conf.d/*.toml # User fragments, loaded alphabetically
├── config.toml # Global user config
├── config.<env>.toml # Env-specific user config
├── config.local.toml # User-local overrides
└── config.<env>.local.toml # Env-specific user-local overrides
zshenv
エディタのPATHにも影響するのでbrew,miseのpathまわりはzshenvにセットしておく。
# mise
export PATH="$HOME/.local/bin:$HOME/.local/share/mise/shims:$PATH"
# homebrew
if [[ -d /opt/homebrew ]]; then
# from eval "$(/opt/homebrew/bin/brew shellenv)"
export HOMEBREW_PREFIX="/opt/homebrew"
export HOMEBREW_CELLAR="/opt/homebrew/Cellar"
export HOMEBREW_REPOSITORY="/opt/homebrew"
export PATH="/opt/homebrew/bin:/opt/homebrew/sbin:$PATH"
export MANPATH="/opt/homebrew/share/man:$MANPATH"
export INFOPATH="/opt/homebrew/share/info:$INFOPATH"
elif [[ -d /home/linuxbrew/.linuxbrew ]]; then
# from eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"
export HOMEBREW_PREFIX="/home/linuxbrew/.linuxbrew"
export HOMEBREW_CELLAR="/home/linuxbrew/.linuxbrew/Cellar"
export HOMEBREW_REPOSITORY="/home/linuxbrew/.linuxbrew/Homebrew"
export PATH="/home/linuxbrew/.linuxbrew/bin:/home/linuxbrew/.linuxbrew/sbin:$PATH"
export MANPATH="/home/linuxbrew/.linuxbrew/share/man:$MANPATH"
export INFOPATH="/home/linuxbrew/.linuxbrew/share/info:$INFOPATH"
fi
おわり
あとはdirほってsymlinkはるだけにして、極力複雑なことはせず。 LLMに書かせたせいかやや仰々しい install script になってしまったがやってることは単純なので手入れは楽かな。 認知負荷最小化しつつ大部分を宣言的にできたのでよかったです。
成果物はこちら: