はじめに
普段から「クリーンな PC 環境」を意識しており、
- 不要な PATH 設定は入れたくない
- できるだけ OS 標準+Homebrew のデフォルト挙動に寄せたい
- 複数の Mac で同じ
.zprofileを使い回したい
という運用をしています。
今回、新しい Mac と古い Mac の両方で Node.js 環境を統一しようとしたところ、意外とハマったので備忘として残します。
環境
古い PC
- MacBook Pro (Retina, 15-inch, Mid 2015)
- macOS Monterey (12.x)
- これ以上 OS をアップデートできないモデル
新しい PC
- MacBook Pro (16-inch, 2019)
- macOS Ventura 以降
やりたかったこと
理想は次の状態でした。
- 両方の Mac で同じ
.zprofileを使う -
brew install nodeだけで Node を導入 -
~/.zprofileに Node 用の PATH を書きたくない - なるべく「Homebrew 標準のやり方」に寄せたい
新しい Mac では、
brew install node
だけで
which node -> /usr/local/bin/node
となり、PATH 設定なしで普通に使えます。
この状態をそのまま古い Mac にも適用したかった、というのが出発点です。
実際に起きたこと
###新しい Mac
brew install node
→ そのまま成功
→ /usr/local/bin/nodeが利用可能
→ .zprofileに何も追記不要
理想通り。
古い Mac(macOS 12)
同じように
brew install node
を実行すると…
- Node の最新バージョン(v25 系)を入れようとする
- しかし macOS 12 では Bottle が提供されていない
- 結果としてソースビルドが走る
- そのビルドがリンクエラーで失敗
という状況に。
エラーログはこんな感じでした。
ld: symbol(s) not found for architecture x86_64
clang++: error: linker command failed
要するに
「macOS 12 では brew install node の最新版がビルドできない」
というのが根本原因でした。
試行錯誤したこと
brew update-resetbrew doctor- キャッシュ削除
-
HOMEBREW_NO_INSTALL_FROM_API=1の設定 -
homebrew/coreの再 tap
など一通りやりましたが、根本は
「古い OS で最新 Node を入れようとしている」
という構造問題だったため、どれも本質的な解決にはならず。
最終的な方針
考え方を変えてこう判断しました。
- 古い Mac では「最新 Node」を使う必要はない
- 安定して入る LTS を使えばいい
- ただし PATH 設定はなるべく最小限にしたい
そこで採用したのが:
brew install node@20
という方法。
結論:こうした
古い Mac では最終的に .zprofile に次の1行だけ追加しました。
export PATH="/usr/local/opt/node@20/bin:$PATH"
これにより:
- 古い Mac では Node 20 を安定して利用
- 新しい Mac は
brew install nodeのまま - それ以外の設定は両方で共通化
という形で落ち着きました。
学び・Tips
今回の件から得られた教訓:
1. ホスト OS に Node を直接入れるのは極力避ける
可能なら
- Node
- PHP
- 各種ランタイム
は Docker コンテナ内で完結させた方がトラブルが少ない。
「ホスト OS を汚さない運用」はやはり正義。
2. 古い Mac は Homebrew の最新構成と相性が悪い
macOS 12 は Homebrew 的には Tier 3 扱い。
- 最新の formula がビルドできない
- bottle が提供されない
- 公式サポート対象外
という前提を理解した上で運用する必要がある。
3. 環境統一は「理想」と「現実」の折り合い
本当は
brew install nodeだけで全 Mac 共通
にしたかったけど、OS の制約で断念。
環境差異がある場合は、
- 「どこまで共通化するか」
- 「どこからは割り切るか」
の線引きが重要。
まとめ
- 新しい Mac →
brew install nodeでOK - 古い Mac (macOS 12) →
brew install node@20+ PATH 追加 - それ以外は同一
.zprofileで運用
というのが現実的な落としどころでした。