はじめに

以前Macを使っていた頃は、

とりあえずHomebrewで全部入れる

という運用をしていた記憶があります。
久々にMacに戻ってきて環境構築をしてみると、
最近はそうでもなさそう という印象を持ちました。

特に、
* 言語ランタイム管理に asdf を使う
* HomebrewはOS周り・CLIツール中心

という分業が、わりと一般的になっているようです。

本記事では、
Homebrewとasdfをどう使い分けるか を、
実際に環境を作りながら感じた範囲で整理してみます。

Homebrewの役割

Homebrewは今でもMacのパッケージ管理の中心ですが、
役割は以前よりも少し絞られている印象です。

Homebrewで管理するもの

  • OSに強く依存するツール
  • CLIユーティリティ
  • GUIアプリ(cask)

例:

brew install git jq wget
brew install --cask visual-studio-code google-chrome

これらは、
* バージョンを細かく切り替える必要がない
* プロジェクト単位で変わらない

という特徴があるため、
Homebrew管理が一番楽です。

asdfの役割

asdfは複数言語のランタイム管理をまとめて行えるツールです。

asdfで管理するもの

  • Python
  • Node.js
  • Ruby
  • Java など

いわゆる 「プロジェクトごとにバージョンが変わりうるもの」を担当させる、
というのが分かりやすい使い方だと感じました。

brew install asdf

Homebrewとasdfの使い分けまとめ

種類 管理ツール
OS系CLI Homebrew
GUIアプリ Homebrew
言語ランタイム asdf
プロジェクト依存ツール asdf(必要に応じて)

「全部brew」よりも、
責務を分けた方が後々楽なのかも という印象です。

asdfを使い始めるにあたっての注意点(2026年版)

ここで一つ、
最近ハマりやすいポイントがあります。

asdf global / asdf local が見当たらない?

ネットの記事を探すと、以下のようなコマンドがよく出てきます。

asdf global python 3.11.0
asdf local python 3.11.0

ところが、最近のasdfでは
これらのサブコマンドが存在しません。

代わりに、以下の形式に置き換わっています。

新しい指定方法:asdf set

グローバル(ホームディレクトリ)に設定する場合

asdf set --home python 3.12.1

これは、従来の asdf global に相当します。

ディレクトリ単位で設定する場合

asdf set --parent python 3.12.1

これは、従来の asdf local に近い挙動で、
.tool-versions を親ディレクトリに作成します。

.tool-versions の扱い

  • プロジェクト単位で管理したい場合
    → リポジトリ直下に .tool-versions
  • 個人環境のデフォルト
    --home で設定

という使い分けが無難そうです。

ハマりポイント

1. 古い記事とのコマンド差分

  • asdf global / asdf local 前提の記事が多い
  • そのまま打つと「そんなサブコマンドはない」と怒られる

→ 公式ドキュメントを見るのが一番確実

2. Homebrewで入れた言語と混ざる

  • brewでPythonを入れている
  • asdfでもPythonを入れている

という状態になると、
どのPythonが使われているのか分からなくなりがちです。
→ 言語ランタイムは どちらか一方に寄せる のが無難な気がします。

まとめ

久々にMac環境を作ってみて、

  • Homebrewは今も中心的存在
  • ただし「全部brew」ではなくなっている
  • 言語ランタイムはasdfに寄せるのが楽

という印象を持ちました。

また、asdfについては
古い記事とコマンド体系が変わっている 点に注意が必要です。

同じように「最近のMac事情よく分からん」という状態から
環境構築をする人の参考になれば幸いです。