MacBook AirのHomebrew環境をBrewfileでMac miniへ移行し、Python環境はuvで管理する方針にする
Mac miniを開発用・自宅サーバ用の環境として整備するため、MacBook Airで使っていたHomebrew環境を移行しました。
Homebrewには brew bundle という仕組みがあり、現在インストールされているパッケージ一覧を Brewfile として書き出し、別のMacでまとめてインストールできます。
今回は、MacBook Air側で Brewfile を作成し、Mac mini側へコピーして、必要なパッケージを整理したうえでインストールしました。
また、Python関連については、今後はRust製のPythonパッケージ管理ツールである uv を使う方針にしました。
参考にした記事
Homebrew Bundleについては、以下の記事を参考にしました。
Macのお引越しも怖くない!Homebrew環境を「brew bundle」で簡単バックアップ&復元ガイド
uvについては、以下の記事を参考にしました。
うさぎでもわかるシリーズ:Rust製のPythonパッケージ管理ツール「uv」が急に流行った件について
brew bundleとは
brew bundle は、Homebrewに標準で用意されている追加機能です。
Brewfile というファイルに、現在Homebrewでインストールされているものを記録できます。
記録できる主な内容は以下です。
brew:git、node、wgetなどのCLIツールcask:Google Chrome、VSCode、SlackなどのGUIアプリtap:Homebrew公式以外の配布元リポジトリ
これを使うことで、MacBook Airで使っていたHomebrew環境をMac miniへ移行しやすくなります。
MacBook Air側でBrewfileを書き出す
まず、MacBook Air側で現在のHomebrew環境を書き出します。
brew bundle dump
これで、カレントディレクトリに Brewfile が作成されます。
Mac mini側に作業ディレクトリを作る
次に、Mac mini側で移行用の作業ディレクトリを作成します。
mkdir migration
BrewfileをMac miniへコピーする
MacBook Air側から、作成した Brewfile をMac miniへコピーします。
scp Brewfile macmini:~/migration/
Mac mini側で中身を確認します。
cat migration/Brewfile
元のBrewfileには、以下のような内容が含まれていました。
brew "xz" brew "zstd" brew "jpeg-xl" brew "aom" brew "openssl@3" brew "protobuf" brew "libssh2" brew "aria2" brew "berkeley-db", link: true brew "cmake" brew "exiftool" brew "flac" brew "unbound" brew "gnutls" brew "harfbuzz" brew "libass" brew "librist" brew "libssh" brew "pango" brew "tesseract" brew "ffmpeg" brew "gnupg" brew "gpgme" brew "numpy" brew "poppler" brew "gdal" brew "git" brew "git-lfs" brew "guile" brew "nkf" brew "nodebrew" brew "openssl@1.1" brew "openvino" brew "perl" brew "portaudio" brew "pyenv" brew "python@3.10" brew "python@3.11" brew "qemu" brew "rust" brew "ta-lib" brew "tesseract-lang" brew "tree" brew "uchardet" brew "vim" brew "wget" brew "zlib" go "golang.org/x/tools/cmd/godoc" go "golang.org/x/tools/gopls"
Brewfileの問題点を整理する
そのまま移行してもよいのですが、Mac miniを長期運用する開発環境にするため、いくつか気になる点を整理しました。
openssl@1.1は外す
openssl@1.1 は古く、今後さらに扱いが厳しくなりそうです。
過去のメモを確認すると、Google Cloud Vision API自体に openssl@1.1 が必要だったわけではありませんでした。
原因は、過去に pyenv でビルドされたPython 3.10.6が openssl@1.1 にリンクされていたことでした。
そのため、今回はBrewfileから外します。
numpyはbrewではなくPython環境側で管理する
numpy をHomebrewで入れると、venvやpipで入れたnumpyと混ざりやすくなります。
Pythonパッケージは、プロジェクトごとに仮想環境で管理した方が安全です。
そのため、numpy もBrewfileから外します。
python@3.10とpython@3.11は外す
元のBrewfileには、以下が含まれていました。
brew "python@3.10" brew "python@3.11" brew "pyenv"
PythonをHomebrew版で固定するのか、pyenv で管理するのかが混ざっています。
今後はPython環境を uv 中心で管理したいため、Homebrewで複数バージョンのPythonを入れるのは避けます。
berkeley-dbのlink: trueは外す
元のBrewfileには以下がありました。
brew "berkeley-db", link: true
link: true は、システムから見える場所にシンボリックリンクを作るため、別ライブラリと衝突する可能性があります。
今回は安全寄りにして、link: true は外します。
Go関連は今回はHomebrewでは入れない
元のBrewfileには以下がありました。
go "golang.org/x/tools/cmd/godoc" go "golang.org/x/tools/gopls"
ただし、brew "go" は含まれていませんでした。
Go本体を別経路で入れていた可能性があります。
今回はGo言語は公式リポジトリから入れているため、Homebrew側では入れない方針にしました。
安全寄りのBrewfileを作成する
Mac mini側で、整理した安全寄りのBrewfileを作成します。
vim migration/Brewfile.safe
内容は以下です。
# --- Core tools --- brew "git" brew "git-lfs" brew "wget" brew "tree" brew "vim" brew "cmake" brew "perl" brew "rust" brew "qemu" brew "aria2" brew "nkf" brew "gnupg" brew "gpgme" brew "unbound" # --- Compression / codecs --- brew "xz" brew "zstd" brew "zlib" brew "aom" brew "jpeg-xl" brew "flac" # --- Crypto / TLS --- brew "openssl@3" brew "libssh2" brew "libssh" brew "gnutls" # --- Media / text / OCR / PDF --- brew "harfbuzz" brew "pango" brew "libass" brew "librist" brew "tesseract" brew "tesseract-lang" brew "poppler" brew "ffmpeg" brew "exiftool" brew "uchardet" # --- Geo --- brew "gdal" # --- Dev runtimes / version managers --- brew "pyenv" brew "nodebrew" # --- Other --- brew "protobuf" brew "portaudio" brew "ta-lib" brew "guile" brew "openvino" brew "berkeley-db"
brew bundle installでまとめてインストールする
作業ディレクトリへ移動します。
cd migration
作成した Brewfile.safe を指定してインストールします。
brew bundle install --file Brewfile.safe
実行すると、Homebrewの自動更新が行われ、その後パッケージが順番にインストールされました。
ログの一部は以下です。
Installing git Installing git-lfs Installing wget Installing tree Installing vim Installing cmake Installing perl Installing rust Installing qemu Installing aria2 Installing nkf Installing gnupg Installing gpgme Installing unbound Installing xz Installing zstd Installing zlib Installing aom Installing jpeg-xl Installing flac Installing openssl@3 Installing libssh2 Installing libssh Installing gnutls Installing harfbuzz Installing pango Installing libass Installing librist Installing tesseract Installing tesseract-lang Installing poppler Installing ffmpeg Installing exiftool Installing uchardet Installing gdal Installing pyenv Installing nodebrew Installing protobuf Installing portaudio Installing ta-lib Installing guile Installing openvino Installing berkeley-db `brew bundle` complete! 43 Brewfile dependencies now installed.
brew bundle が完了し、43個の依存関係がインストールされました。
重いパッケージに注意
今回のBrewfileには、依存関係が多いパッケージも含まれています。
特に以下は、インストールに時間がかかったり、環境によっては途中で止まる可能性があります。
gdalffmpegpopplertesseractharfbuzzpango
OCR、PDF処理、地理情報、音声・動画処理を行う予定があるため、今回は入れておきました。
Google Cloud Vision APIとgcloud CLIについて
過去のメモでは、Google Cloud Vision API関連で openssl@1.1 が出てきました。
ただし、Google Cloud Vision APIをPythonから使うだけなら、基本的に必要なのは以下です。
- サービスアカウントキー
google-cloud-visionPython SDKGOOGLE_APPLICATION_CREDENTIALS環境変数
gcloud CLIは、必ずしも必須ではありません。
ただし、以下を行う場合は入れておいてもよさそうです。
- Application Default Credentialsを使いたい
- プロジェクト切り替えをCLIで管理したい
- 将来BigQuery、Google Cloud Storage、Firebaseも触る
- Raspberry Pi、Mac、Colab間で認証を使い回す
今回は、gcloud CLIは必須ではないものとして扱います。
Python環境はuvで管理する方針
次に、Python関連の管理方針です。
最近、Rust製のPythonパッケージ管理ツールである uv がよく使われるようになっています。
uv は、以下のような複数ツールの役割をまとめる方向のツールです。
pippip-toolsvirtualenvpipxpoetrypyenv
パッケージ解決やインストールが高速で、pipより10倍から100倍程度高速と紹介されることもあります。
Mac miniでは、今後Pythonプロジェクトごとに uv を使って環境を分けていく方針にします。
uvの注意点
uv はPythonパッケージ管理には便利ですが、非Pythonパッケージの管理には対応していません。
そのため、システムライブラリやバイナリ依存が多いプロジェクトでは注意が必要です。
例えば、科学計算ライブラリやGPU・数値計算まわりの依存が多い場合は、condaの方が適しているケースもあります。
今回のMac mini環境では、システム寄りの依存はHomebrew、Pythonプロジェクト単位の依存はuvで管理する方針にします。
uvをインストールする
uvはHomebrewでインストールできます。
brew install uv
インストール後、バージョンを確認します。
uv --version
バージョンが表示されれば、uvのインストールは完了です。
今回の方針まとめ
今回、Mac miniの開発環境は以下の方針にしました。
- Homebrew環境は
brew bundleで移行する - 元のBrewfileをそのまま使わず、安全寄りに整理する
openssl@1.1は外すnumpyはHomebrewではなくPython環境側で管理する- Python本体やパッケージ管理は今後
uvを中心にする - システム依存はHomebrew、プロジェクト依存はuvで分ける
今回の結果
今回の作業で、以下まで完了しました。
- MacBook Air側で
Brewfileを書き出した - Mac mini側へ
Brewfileをコピーした - 不要・注意が必要なパッケージを整理した
Brewfile.safeを作成したbrew bundle install --file Brewfile.safeで43個の依存関係をインストールした- Python環境は今後
uvで管理する方針にした brew install uvでuvを入れる予定を立てた
次にやること
次は、Python関連を uv で整備します。
uvのインストール確認- プロジェクトごとの仮想環境作成
- VOICEVOX連携用のPython実験
- 天気アプリの音声読み上げ処理の移行
- Neo4j連携用Python環境の作成
まとめ
MacBook AirのHomebrew環境をMac miniへ移行するため、brew bundle を使いました。
ただし、元の Brewfile をそのまま使うと、古い openssl@1.1 やbrew版 numpy、複数のPythonバージョンなどが混ざり、後で環境が複雑になりそうでした。
そのため、安全寄りの Brewfile.safe を作成し、必要なCLIツール、OCR、PDF、メディア処理、地理情報系のライブラリをまとめてインストールしました。
Pythonについては、今後は uv を使い、プロジェクト単位で環境を分ける方針にします。
Homebrewでシステム寄りの依存を整え、uvでPythonプロジェクトを管理する形にすると、Mac miniを長期運用する開発環境として扱いやすくなりそうです。

コメント