Homebrew — дефолтный пакетный менеджер на Mac у большинства разработчиков. Ниже — как им пользоваться так, чтобы через год brew list не превратился в свалку 🧰

Установка и PATH #

Официальный install script — с https://brew.sh. На Apple Silicon префикс:

/opt/homebrew

Проверка:

brew --prefix   # /opt/homebrew
echo "$PATH" | tr ':' '\n' | head

В .zprofile (не только .zshrc — GUI-приложения иначе не видят):

eval "$(/opt/homebrew/bin/brew shellenv)"

Ежедневные команды #

brew update                 # обновить формулы
brew upgrade                # обновить пакеты
brew upgrade hugo           # точечно
brew info hugo
brew list --versions
brew search ripgrep
brew install ripgrep fd bat
brew uninstall old-tool

Pin, если мажор ломает CI:

brew pin hugo
brew unpin hugo

Brewfile: инфраструктура как код для ноутбука #

brew bundle dump --file=~/dotfiles/Brewfile --force

Пример Brewfile:

brew "git"
brew "hugo"
brew "fzf"
brew "ripgrep"
cask "iterm2"   # GUI — через cask

На новой машине:

brew bundle --file=~/dotfiles/Brewfile

Так восстанавливается набор CLI, а не «что вспомнил».

Гигиена #

brew doctor          # сначала читать, не слепо «fix»
brew cleanup -s      # старые версии + кэш
brew autoremove      # лишние зависимости
du -sh "$(brew --cache)"

Раз в квартал:

brew leaves          # верхнеуровневые пакеты
# удалить то, чем не пользовались полгода

Частые грабли #

  1. Два Homebrew (Intel + ARM после миграции) — оставьте один prefix, почистите PATH.
  2. pip install –user рядом с brew install python — путаница модулей; для проектов — uv/venv, не глобальный pip.
  3. sudo brew — никогда. Ломает права в /opt/homebrew.
  4. CI — не ставьте «свежий brew» на каждый job без кэша; pin версий или используйте готовые action/image.

Linux? #

Linuxbrew/Homebrew on Linux работает, но на серверах Debian/Ubuntu я предпочитаю apt + upstream .deb/docker: меньше расхождения с политикой обновлений ОС. Homebrew — в первую очередь dev-машина.

Итог #

Brewfile в dotfiles + upgrade осознанно + cleanup по расписанию. Homebrew перестаёт быть магией и становится просто ещё одним манифестом окружения 📦