MacBook AirのHomebrew環境をBrewfileでMac miniへ移行し、Python環境はuvで管理する方針にする

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には、依存関係が多いパッケージも含まれています。

特に以下は、インストールに時間がかかったり、環境によっては途中で止まる可能性があります。

  • gdal
  • ffmpeg
  • poppler
  • tesseract
  • harfbuzz
  • pango

OCR、PDF処理、地理情報、音声・動画処理を行う予定があるため、今回は入れておきました。

Google Cloud Vision APIとgcloud CLIについて

過去のメモでは、Google Cloud Vision API関連で openssl@1.1 が出てきました。

ただし、Google Cloud Vision APIをPythonから使うだけなら、基本的に必要なのは以下です。

  • サービスアカウントキー
  • google-cloud-vision Python SDK
  • GOOGLE_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 は、以下のような複数ツールの役割をまとめる方向のツールです。

  • pip
  • pip-tools
  • virtualenv
  • pipx
  • poetry
  • pyenv

パッケージ解決やインストールが高速で、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を長期運用する開発環境として扱いやすくなりそうです。

コメント

タイトルとURLをコピーしました