Сразу зафиксируем расклад на 2026 (macOS 26 Tahoe, Apple Silicon - основная платформа, Intel в Tahoe поддерживается последний раз). Homebrew закрывает 90% бытовых задач: CLI-утилиты и GUI-приложения (cask) в /opt/homebrew. Остальные инструменты не конкуренты, а дополнения для конкретных дыр: App Store, воспроизводимость, версии языков.
mas: ставим приложения из Mac App Store cli
Главная боль: часть софта живёт ТОЛЬКО в Mac App Store - Xcode, Keynote, Pages, многие платные утилиты с лицензией, привязанной к Apple Account. Homebrew cask их не тянет, потому что это не свободно скачиваемые .dmg, а покупки, привязанные к аккаунту с DRM. Тут и нужен mas (mac app store cli) - тонкая обёртка над приватным API App Store.
Ставится сам через brew:
Код: Выделить всё
brew install mas
Код: Выделить всё
mas search Xcode
Код: Выделить всё
497799835 Xcode (16.4)
1480068240 Apple Configurator (2.18)
Код: Выделить всё
mas install 497799835
Код: Выделить всё
mas lucky Keynote
Код: Выделить всё
mas list
Код: Выделить всё
409183694 Keynote (14.2)
409201541 Pages (14.2)
1295203466 Microsoft Remote Desktop (10.9.9)
Грабли номер два - покупка должна уже быть в аккаунте. mas install не покупает приложение и не жмёт за тебя Get. Платный софт ставится, только если он уже привязан к этому Apple Account (когда-то "куплен", пусть и бесплатно). Иначе - отказ. mas - это автоматизация скачивания уже принадлежащего тебе, а не магазин в терминале.
Обновить всё разом:
Код: Выделить всё
mas upgrade
Код: Выделить всё
brew "git"
cask "iterm2"
mas "Xcode", id: 497799835
mas "Keynote", id: 409183694

MacPorts: другая философия и /opt/local
macports - старейший пакетный менеджер mac (растёт из проекта NeXT/BSD-портов). Идеология противоположна Homebrew по двум пунктам.
Первое - изоляция. Homebrew по-человечески тащит готовые бинарники (bottles) и не любит зависеть от системных библиотек. MacPorts идёт дальше: ставит ВСЁ в свой префикс /opt/local, включая собственные копии зависимостей вплоть до низкоуровневых библиотек, и старается не трогать систему вообще. Сборки идут в песочнице под отдельным пользователем macports, где доступ к файлам вне каталога сборки перехватывается и блокируется - так MacPorts защищается от случайного захвата системных tool'ов. Это даёт повторяемость и предсказуемость ценой объёма на диске и времени.
Второе - сборка из исходников по умолчанию. MacPorts чаще компилирует port локально (хотя есть и предсобранные archives), тащит зависимости целиком, и потому занимает больше места. Homebrew наоборот - сперва пытается налить bottle.
Базовые команды (обрати внимание - тут нужен sudo, потому что /opt/local общий для всех пользователей машины):
Код: Выделить всё
sudo port selfupdate
port search wget
sudo port install wget
sudo port upgrade outdated
Код: Выделить всё
port installed
port dependents wget
Код: Выделить всё
echo $PATH
which wget
Когда выбирают MacPorts. Нужна максимальная изоляция от системы; нужен пакет, которого нет в brew, но есть порт; нужны редкие варианты сборки с конкретными флагами (variants - фишка MacPorts: sudo port install ffmpeg +nonfree); работаешь в среде, где принято от source собирать. Важно: не держи MacPorts и Homebrew одновременно "горячими" в одном PATH без понимания, что делаешь - две копии одной библиотеки в /opt/local и /opt/homebrew плюс системная это классический источник плавающих сбоев линковки. Технически уживаются, но дисциплина PATH обязательна.
Nix и nix-darwin: декларативное воспроизводимое окружение
Это другой класс инструмента, не "ещё один brew". Nix - функциональный пакетный менеджер: пакеты лежат в /nix/store по хешу от всех входных данных (исходники, флаги, зависимости). Два пакета с разными зависимостями физически не пересекаются, версии сосуществуют, откат мгновенный. На вершине - nix darwin: описываешь ВСЮ систему (пакеты, дефолты macOS, шелл, даже launchd-сервисы) в одном Nix-flake, а потом разворачиваешь командой.
Идея на пальцах: вместо "ставлю руками brew install это, defaults write то, скачиваю сё" ты пишешь файл-конфигурацию, коммитишь в гит, и на любой машине darwin-rebuild switch приводит систему ровно к описанному состоянию. Стёр Mac начисто - прогнал rebuild - вернулся к тому же окружению бит в бит.
Кусок flake.nix (упрощённо), где видно дух подхода - декларативный список пакетов и системных настроек:
Код: Выделить всё
{
environment.systemPackages = [
pkgs.git
pkgs.ripgrep
pkgs.jq
];
system.defaults.dock.autohide = true;
system.defaults.finder.AppleShowAllExtensions = true;
programs.zsh.enable = true;
}
Код: Выделить всё
darwin-rebuild switch --flake ~/.config/nix-darwin
Код: Выделить всё
darwin-rebuild switch --rollback
Грабли. Порог входа высокий - Nix-язык непривычный, ошибки криптовые. На Apple Silicon следи за архитектурой (aarch64-darwin против x86_64). Установка тащит том /nix и демона nix-daemon - на корпоративных машинах с жёстким MDM это иногда упирается в политики. Для одного человека на одном ноуте Nix чаще оверкилл; его ценность раскрывается на масштабе и в команде.
asdf и mise: версии языков, а не пакеты
Отдельная ниша, которую путают с пакетными менеджерами. asdf и mise (наследник, на Rust, быстрее) решают одну задачу: держать несколько версий языков и переключать их по проекту. Тебе нужно Node 18 в одном проекте и Node 22 в другом, Python 3.11 тут и 3.13 там - системный brew install node ставит ОДНУ глобальную версию и для этого не годится.
mise читает файл в каталоге проекта и автоматически подставляет нужные версии, когда ты в него заходишь:
Код: Выделить всё
brew install mise
mise use node@22
mise use python@3.13
mise install
Ключевое различие в голове держи так: brew/MacPorts/Nix управляют ПАКЕТАМИ (что установлено в систему), а mise/asdf управляют ВЕРСИЯМИ рантаймов на проект (что активно прямо сейчас в этом каталоге). Они не конкуренты, а слои - mise обычно ставят через brew и используют поверх.
Сравнение: что под что выбирать
Коротко по сценариям, без воды:
- CLI-утилиты и GUI-приложения, один человек, быстро - Homebrew (formula + cask). Дефолт, хватает почти всегда.
- Софт только из Mac App Store (Xcode, Keynote, платные лицензии) - mas, поверх входа в App Store, в идеале через Brewfile.
- Максимальная изоляция от системы, кастомные сборки с флагами, редкий порт - MacPorts (/opt/local, sudo, variants).
- Воспроизводимое окружение для команды/парка, развёртывание из гита, откаты - Nix/nix-darwin (часто в гибриде с brew для GUI).
- Несколько версий языков по проектам - mise (или asdf), поверх brew, не вместо него.
Мини-лаба: собрать стек рукамиПравило большого пальца: начинай с Homebrew. Добавляй mas, когда упёрся в App Store. Добавляй mise, когда упёрся в версии языков. Тянись к Nix, только когда боль воспроизводимости на команде/парке реально жжёт - не раньше.
Повтори по шагам, это 10 минут:
- Установи mas: brew install mas. Затем mas list - убедись, что видишь установленные App Store-приложения с их ID. Если список пуст, открой App Store и проверь, что ты залогинен.
- Сделай mas search Telegram и найди ID. Не ставь, просто разбери вывод - где ID, где версия.
- Сделай brew bundle dump в пустом каталоге и посмотри, попали ли в Brewfile строки mas "...". Открой файл, найди секции brew/cask/mas.
- Установи mise: brew install mise. Создай тестовый каталог, зайди в него, выполни mise use node@22, потом node --version. Выйди в родительский каталог и проверь, что версия node сменилась (или исчезла).
- Только если интересен Nix и не жалко песочницу: глянь nix-darwin на github (nix-darwin/nix-darwin), прочитай пример flake.nix. Ставить на рабочую машину без понимания не стоит - сначала теория.
- Почему mas не может авторизоваться паролем из терминала и что нужно сделать ДО запуска mas install?
- Чем философия MacPorts (/opt/local, песочница, source) отличается от Homebrew по части изоляции от системы, и какой ценой?
- В чём принципиальная разница задач у Homebrew и у mise/asdf - почему это не конкуренты, а разные слои?
- Какую боль закрывает nix-darwin, которую не закрывает ни brew, ни mas, и почему его обычно держат в гибриде с Homebrew?
Homebrew - твой дефолт и центр тяжести. mas прикручивает к нему Mac App Store через числовые ID и Brewfile, но требует ручного входа в App Store. MacPorts - выбор под жёсткую изоляцию в /opt/local и кастомные сборки. Nix/nix-darwin - тяжёлая артиллерия декларативной воспроизводимости для команд и парка машин. mise/asdf - не про пакеты, а про версии языков по проектам. Не ищи один менеджер на всё: правильный ответ - Homebrew плюс точечно то, что закрывает конкретную дыру.