macOS из коробки - это полноценный Unix, но без вменяемого способа ставить и обновлять консольный софт. Хочешь свежий git, wget, jq, htop, ffmpeg или новую версию node? В системе либо древняя версия (Apple обновляет системные утилиты раз в эпоху), либо её нет вовсе. Скачивать архивы с непонятных сайтов, собирать из исходников вручную, разбираться с зависимостями - это путь в ад. А когда захочешь снести - ищи руками, что куда легло.
Вот эту боль и закрывает Homebrew. Это де-факто стандарт установки софта на Mac: один менеджер ставит, обновляет, удаляет и CLI-инструменты, и обычные GUI-приложения. Если ты только разбираешься, что такое Homebrew - думай о нём как об App Store для терминала, только с тысячами пакетов, версионированием и автоматическим разрешением зависимостей. Команда brew install ставит пакет вместе со всем, что ему нужно, и держит учёт, чтобы потом чисто удалить.
Ключевая идея, которая отличает Homebrew от apt/yum в Linux - он живёт в своём префиксе и принадлежит твоему пользователю, а не root. Поэтому brew на Mac в обычной работе не требует sudo. Это и удобно, и безопасно: пакетный менеджер не лезет в системные каталоги, которые на современной macOS вообще защищены от записи (там SIP и подписанный системный том только для чтения).

Что под капотом: Ruby, GitHub, бинарные bottles и префикс
Сам Homebrew написан на Ruby (интерпретатор Ruby идёт в комплекте, системный трогать не надо). Каждый пакет описан "формулой" (formula) - это Ruby-файл с метаданными: откуда качать исходник, какие зависимости, как собирать, какие тесты гонять. Формулы и каски лежат в обычных Git-репозиториях на GitHub (core-репозиторий Homebrew/homebrew-core), поэтому brew update - это по сути git pull свежих описаний пакетов.
Теперь важный момент про скорость. Собирать каждый пакет из исходников долго. Поэтому Homebrew раздаёт bottles - заранее скомпилированные бинарные сборки формул под конкретную архитектуру и версию macOS. Когда ты пишешь brew install wget, и для твоей системы (например, Apple Silicon на macOS 26 Tahoe) есть готовый bottle - он просто скачивается и распаковывается за секунды. Сборка из исходника включается только если bottle нет или ты явно попросил флагом. Поэтому установка обычно мгновенная, а не "пойду заварю кофе".
Куда всё это кладётся - определяет префикс. Здесь принципиальная разница между чипами:
- Apple Silicon (M-серия): префикс /opt/homebrew
- Intel: префикс /usr/local
- /opt/homebrew/Cellar - физические файлы пакетов-формул, по папке на версию: Cellar/wget/1.25.0/...
- /opt/homebrew/Caskroom - сюда ставятся каски (GUI-приложения)
- /opt/homebrew/bin - симлинки на бинарники из Cellar (это то, что попадает в PATH)
- /opt/homebrew/opt - стабильные симлинки на "текущую" версию каждого пакета
Установка Homebrew и настройка PATH через brew shellenv
Установка Homebrew - один официальный скрипт с brew.sh. Не качай brew с левых зеркал, бери только официальную команду:
Код: Выделить всё
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
На Apple Silicon есть нюанс, на котором спотыкаются почти все новички: /opt/homebrew/bin не входит в системный PATH по умолчанию. Ты ставишь brew, пишешь brew install, а шелл отвечает command not found. Лечится это строкой brew shellenv, которую тот же скрипт в конце и подсказывает добавить. Для zsh (шелл по умолчанию в macOS):
Код: Выделить всё
echo >> ~/.zprofile
echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> ~/.zprofile
eval "$(/opt/homebrew/bin/brew shellenv)"
Код: Выделить всё
$ /opt/homebrew/bin/brew shellenv
export HOMEBREW_PREFIX="/opt/homebrew";
export HOMEBREW_CELLAR="/opt/homebrew/Cellar";
export HOMEBREW_REPOSITORY="/opt/homebrew";
export PATH="/opt/homebrew/bin:/opt/homebrew/sbin${PATH+:$PATH}";
export MANPATH="/opt/homebrew/share/man${MANPATH+:$MANPATH}:";
export INFOPATH="/opt/homebrew/share/info:${INFOPATH:-}";
Код: Выделить всё
$ which git
/opt/homebrew/bin/git
$ git --version
git version 2.49.0
Формулы против касков: brew install и brew install --cask
В Homebrew два типа пакетов, и важно их не путать.
- Formulae (формулы) - консольные программы, библиотеки, языки, демоны. git, wget, jq, node, python, ffmpeg. Ставятся в Cellar, бинарники линкуются в bin/. Команда: brew install имя.
- Casks (каски) - готовые macOS GUI-приложения в виде .app-бандлов: браузеры, редакторы, мессенджеры. Homebrew скачивает их .dmg/.pkg, распаковывает и кладёт .app в /Applications. Команда: brew install --cask имя.
Код: Выделить всё
$ brew install wget # формула, CLI-утилита
$ brew install --cask firefox # каск, GUI-приложение в /Applications
$ brew install --cask visual-studio-code
Базовые команды: install, search, info, list, deps, outdated, upgrade, uninstall
Минимальный набор, который покрывает 95% работы с brew на Mac:
Код: Выделить всё
$ brew search node # ищем пакет по имени/описанию
$ brew info wget # карточка пакета: версия, зависимости, размер
$ brew install wget # ставим формулу
$ brew list # что вообще установлено
$ brew deps --tree wget # дерево зависимостей пакета
$ brew outdated # что устарело и можно обновить
$ brew upgrade # обновить всё (формулы и каски)
$ brew upgrade wget # обновить один пакет
$ brew uninstall wget # удалить
$ brew autoremove # снести зависимости, которые больше никому не нужны
Код: Выделить всё
$ brew info wget
==> wget: stable 1.25.0 (bottled)
Retrieve files using HTTP, HTTPS, FTP and FTPS
https://www.gnu.org/software/wget/
Installed
/opt/homebrew/Cellar/wget/1.25.0 (92 files, 4.5MB) *
==> Dependencies
Required: libidn2, openssl@3, ...
==> Analytics
install: 180,000 (30 days)
Полезная связка для уборки. Со временем в Cellar копятся старые версии и кеши скачанных архивов. Чистится так:
Код: Выделить всё
$ brew cleanup -n # -n = dry-run, только показать, что удалит
$ brew cleanup # реально почистить старые версии и кеши
$ brew doctor # диагностика: brew сам подскажет проблемы
Для воспроизводимого окружения (новый Mac, командный стандарт) есть Brewfile - декларативный список пакетов:
Код: Выделить всё
$ brew bundle dump # выгрузить текущий набор в файл Brewfile
$ brew bundle install # на другой машине поставить всё из Brewfile
- command not found: brew после установки. Классика Apple Silicon - забыл eval brew shellenv в ~/.zprofile. /opt/homebrew/bin просто не в PATH. Добавь строку и открой новый терминал.
- Не лезь под sudo. sudo brew install - грубая ошибка: ломает права в префиксе, потом brew ругается на "permissions". sudo нужен ровно один раз при первичной установке. Если уже сломал - brew doctor подскажет команду chown для починки владельца.
- Путаешь формулу и каск. brew install firefox упадёт или поставит не то - Firefox это каск, нужно --cask. И наоборот, CLI-утилиты каском не ставятся.
- Apple Silicon vs Intel и Rosetta 2. Если ты случайно поставил Homebrew из-под Rosetta (терминал в режиме Intel), он уедет в /usr/local и будет тянуть x86-бинарники. Проверь arm: команда arch должна показывать arm64, а which brew - путь /opt/homebrew/bin/brew. Для нативной M-серии префикс обязан быть /opt/homebrew.
- brew cleanup и Brewfile-cleanup - разные вещи. brew cleanup безопасно чистит старьё. А вот brew bundle cleanup агрессивен: он сносит всё, чего нет в Brewfile, и в свежих версиях цеплял даже приложения из Mac App Store. Всегда гоняй сначала с флагом проверки и читай, что он собрался удалить.
- "Старый" инструмент всё равно запускается. which показал /usr/bin/..., а не /opt/homebrew/... - значит порядок PATH неправильный либо shellenv не применился. Помни: brew shellenv ставит свой bin впереди системного, и это by design.
Повтори руками на своём Mac, по шагам:
Код: Выделить всё
# 1. Проверь, есть ли brew и где он
which brew
brew --prefix # на M-серии ждём /opt/homebrew
# 2. Обнови описания пакетов и проверь здоровье
brew update
brew doctor
# 3. Поставь лёгкую формулу и разбери карточку
brew info jq
brew install jq
jq --version
# 4. Посмотри дерево зависимостей и где физически лежит
brew deps --tree jq
ls $(brew --prefix)/Cellar/jq
# 5. Поставь GUI-приложение каском (на свой вкус)
brew install --cask rectangle
# 6. Что устарело и общая уборка
brew outdated
brew cleanup -n
# 7. Снеси формулу и проверь, что симлинк ушёл
brew uninstall jq
which jq
Контрольные вопросы
- Какой префикс Homebrew на Apple Silicon, какой на Intel, и почему на ARM выбрали именно /opt/homebrew?
- Чем formula отличается от cask, и какой командой ставится каждое? Приведи по примеру.
- Что делает строка eval "$(/opt/homebrew/bin/brew shellenv)" и почему без неё brew не находится после установки?
- Почему brew install не требует sudo, и что произойдёт, если всё же запустить его через sudo?
Homebrew - это стандартный способ жить с софтом на Mac: установка Homebrew одним официальным скриптом, свой префикс (/opt/homebrew на Apple Silicon, /usr/local на Intel), PATH через brew shellenv - и дальше brew install для CLI-формул, brew install --cask для GUI-приложений, brew upgrade/cleanup/doctor для поддержания порядка. Под капотом - Ruby-формулы из Git-репозиториев и быстрые бинарные bottles, а владение префиксом твоим пользователем убирает sudo из повседневной работы. Запомни три вещи: правильный префикс под свой чип, shellenv в профиле и никогда не brew под sudo - на этом построено всё остальное.