Ключевая мысль курса: на macOS есть две независимые вещи с похожими именами - полный Xcode (гигантский IDE из App Store) и Command Line Tools (CLT) - маленький набор консольных утилит. 90% бэкенд- и веб-разработчиков нужен только второй. Полный Xcode - это для iOS/macOS-разработки, симуляторов и сборки .app-бандлов. Не тащи 15+ ГБ, если пишешь на Go или Python.
Слой 1: Xcode Command Line Tools - фундамент всего
Почти любая попытка что-то поставить (включая Homebrew) на чистом Mac упрётся в отсутствие компилятора. Проверим, что есть:
Код: Выделить всё
xcode-select -p
# /Library/Developer/CommandLineTools -> стоят только CLT
# /Applications/Xcode.app/Contents/Developer -> активен полный Xcode
Код: Выделить всё
xcode-select --install
Код: Выделить всё
clang --version
# Apple clang version 17.0.0 (clang-1700.x.x.x)
# Target: arm64-apple-darwin25.x.x <- arm64 на Apple Silicon
git --version
# git version 2.x.x (Apple Git-xxx)
Грабли, которые ловят всех. xcode-select --install печально известен тем, что иногда тянет не самую свежую версию CLT и даже выдаёт ошибку "не удалось найти ПО". Лечится двумя путями: либо качаешь нужный пакет вручную с developer.apple.com (раздел Downloads, More), либо ставишь через GUI Software Update, где CLT приезжают как обновление системы. На некоторых ранних сборках Tahoe (26.0/26.1) установка CLT падала, пока не обновишь систему до 26.2+ - если упёрся, первым делом проверь обновления macOS.
Полный Xcode и его инструменты. Если тебе нужны симуляторы и сборка под Apple-платформы - ставь Xcode из App Store. После установки переключи активный путь, чтобы консольные команды смотрели внутрь Xcode:
Код: Выделить всё
sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer
sudo xcodebuild -license accept # принять лицензию, иначе многое не запустится
Код: Выделить всё
xcrun simctl list devices available # какие симуляторы есть
xcrun simctl boot "iPhone 17" # загрузить конкретный

Слой 2: git на Mac - настройка, ключи, Keychain
git mac из CLT работает прямо из коробки, но есть нюанс: это "Apple Git", он чуть отстаёт от upstream. Если нужна свежая версия с новыми фичами - ставь из Homebrew (brew install git), и он ляжет в /opt/homebrew/bin раньше системного в PATH. Проверить, какой именно git подхватился:
Код: Выделить всё
which git
# /opt/homebrew/bin/git -> brew-версия
# /usr/bin/git -> Apple Git из CLT
Код: Выделить всё
git config --global user.name "Имя Фамилия"
git config --global user.email "you@example.com"
git config --global init.defaultBranch main
git config --global pull.rebase false
git config --global core.autocrlf input # не калечить переводы строк
Код: Выделить всё
git config --global credential.helper osxkeychain
Код: Выделить всё
git credential-osxkeychain erase
host=github.com
protocol=https
SSH-ключи - предпочтительный способ для своих репозиториев. Генерируем современный ed25519 (не RSA, он устарел):
Код: Выделить всё
ssh-keygen -t ed25519 -C "you@example.com"
Код: Выделить всё
Host github.com
AddKeysToAgent yes
UseKeychain yes
IdentityFile ~/.ssh/id_ed25519
Код: Выделить всё
ssh-add --apple-use-keychain ~/.ssh/id_ed25519
ssh -T git@github.com # проверка: Hi <user>! You've successfully authenticated
Главное правило, которое экономит часы боли: не трогай системные интерпретаторы. python mac - больной вопрос. Раньше в системе жил /usr/bin/python (двойка), Apple его выпилила. Сейчас python3 из /usr/bin есть, но это "stub", привязанный к CLT, обновляется как угодно и не предназначен для твоих проектов. sudo pip install в системный Python - прямой путь сломать инструменты ОС.
Что делать вместо этого. Есть два уровня решений:
- Поставить язык целиком через Homebrew (brew install python@3.13) - просто, но даёт по одной версии на формулу и сложно держать несколько параллельно.
- Поставить менеджер версий, который держит сколько угодно версий и переключает их по папкам. Это и есть правильный путь для разработчика.
Ставим mise и активируем в zsh (по умолчанию в macOS оболочка zsh, не bash):
Код: Выделить всё
brew install mise
echo 'eval "$(mise activate zsh)"' >> ~/.zshrc
exec zsh # перезапустить оболочку, чтобы хук подхватился
Ставим версии глобально и пер-проектно:
Код: Выделить всё
mise use -g python@3.13 node@22 # глобальные дефолты
cd myproject
mise use python@3.11 # в этом проекте свой питон
Код: Выделить всё
[tools]
python = "3.11"
node = "22"
Код: Выделить всё
cd myproject && python --version # Python 3.11.x
cd .. && python --version # Python 3.13.x
Слой 4: dotfiles и терминальный тулинг
Окружение, которое ты только что собрал, надо суметь воспроизвести на другой машине за минуты, а не вспоминать по крупицам. Для этого все конфиги (.zshrc, .gitconfig, .ssh/config без приватных ключей, mise-конфиги) кладут в git-репозиторий - dotfiles. Голый подход без лишних утилит - bare-репозиторий прямо в home:
Код: Выделить всё
git init --bare $HOME/.dotfiles
alias dot='git --git-dir=$HOME/.dotfiles/ --work-tree=$HOME'
dot add .zshrc .gitconfig
dot commit -m "init dotfiles"
dot remote add origin git@github.com:you/dotfiles.git
dot push -u origin main
Терминальные инструменты, которые меняют жизнь. Стандартные BSD-утилиты в macOS (это BSD, а не GNU/Linux - ls, sed, find ведут себя иначе, чем в Linux) можно дополнить современными аналогами через Homebrew:
Код: Выделить всё
brew install ripgrep fd bat jq fzf
- ripgrep (команда rg) - поиск по содержимому файлов, на порядок быстрее grep -r, уважает .gitignore.
- fd - человеческая замена find: fd config вместо find . -name "*config*".
- bat - cat с подсветкой синтаксиса и номерами строк.
- jq - разбор и фильтрация JSON прямо в пайпе, незаменим при работе с API.
- fzf - интерактивный нечёткий поиск; после установки запусти $(brew --prefix)/opt/fzf/install для горячих клавиш (Ctrl-R по истории, Ctrl-T по файлам).
Код: Выделить всё
rg -n "TODO" --type py | fzf
Типичные грабли - чек-лист
- sudo pip / sudo gem в системный интерпретатор - так не делают, ломает ОС. Только через mise/brew в свой профиль.
- xcode-select --install падает - сначала обнови macOS (на ранней Tahoe была проблема), потом качай CLT вручную с developer.apple.com.
- Поставил полный Xcode, но xcodebuild ругается - забыл sudo xcodebuild -license accept и xcode-select --switch.
- mise/asdf не переключает версии - нет строки eval с activate в ~/.zshrc; проверь mise doctor.
- git каждый раз спрашивает пароль - не включён credential.helper osxkeychain или для SSH нет UseKeychain yes в ~/.ssh/config.
- Команды Homebrew "не находятся" - на Apple Silicon brew в /opt/homebrew, а не /usr/local; нужен eval "$(/opt/homebrew/bin/brew shellenv)" в профиле.
- Проверь xcode-select -p и при необходимости поставь CLT. Убедись, что clang --version и git --version отвечают.
- Настрой git: имя, почту, init.defaultBranch main, включи credential.helper osxkeychain.
- Сгенерируй ed25519-ключ, пропиши ~/.ssh/config с UseKeychain yes, проверь ssh -T git@github.com.
- Поставь mise, активируй в ~/.zshrc, выполни mise use -g python@3.13 node@22. Создай папку, в ней mise use python@3.11 и докажи через python --version, что версия меняется при cd внутрь и наружу.
- Поставь ripgrep fd bat jq fzf, прогони rg "TODO" по любому проекту.
- Заведи bare-репозиторий dotfiles, закоммить .zshrc и .gitconfig, не забыв исключить ключи.
- Чем Xcode Command Line Tools отличаются от полного Xcode и когда хватает только CLT?
- Почему нельзя ставить пакеты в системный python3 из /usr/bin и что использовать вместо этого?
- Какую строку и зачем нужно добавить в ~/.zshrc, чтобы mise начал переключать версии по папкам?
- Как заставить git и ssh не спрашивать пароль каждый раз, используя именно механизмы macOS?
Машина разработчика на Mac собирается слоями: CLT дают компилятор и базовый git, Homebrew - свежий софт, mise/asdf - изоляцию версий языков без боли с системным Python, Keychain - безопасное хранение секретов, а dotfiles в git превращают всё это в переносимый артефакт. Собери один раз правильно - и переезд на новую машину или ввод в строй нового члена команды станет делом пятнадцати минут, а не дня раскопок.