5. Инструменты разработчика macOS
Developer Tools в macOS
Заголовок раздела «Developer Tools в macOS»macOS предоставляет богатый набор инструментов для разработки прямо из командной строки. Эти команды специфичны для macOS и не встречаются в Linux.
xcode-select — Command Line Tools
Заголовок раздела «xcode-select — Command Line Tools»Command Line Tools — минимальный набор инструментов разработчика Apple: компиляторы (clang), git, make, python и другие базовые утилиты. Это обязательный шаг для любого разработчика на macOS.
# Установить Command Line Toolsxcode-select --install
# Проверить установлено лиxcode-select -p # путь к активным инструментам# /Applications/Xcode.app/Contents/Developer# или# /Library/Developer/CommandLineTools
# Версия CLTpkgutil --pkg-info=com.apple.pkg.CLTools_Executables | grep version
# Переключить между Xcode и CLTsudo xcode-select --switch /Applications/Xcode.appsudo xcode-select --reset # вернуть по умолчанию
# Если Xcode не нужен — установить только CLT (быстрее)sudo xcode-select --installxcrun — запуск инструментов Xcode
Заголовок раздела «xcrun — запуск инструментов Xcode»xcrun находит и запускает инструменты из активного набора Xcode/CLT:
xcrun --show-sdk-path # путь к iOS/macOS SDKxcrun --show-sdk-version # версия SDKxcrun --find clang # найти clangxcrun clang --version # версия компилятора
# Инструменты для iOS разработкиxcrun simctl list devices # список симуляторов iOSxcrun simctl boot "iPhone 15 Pro" # запустить симуляторxcrun simctl install booted app.app # установить приложение
# Компиляцияxcrun clang -o hello hello.c # скомпилировать C программуxcrun swift hello.swift # запустить Swift скриптcodesign — подпись приложений
Заголовок раздела «codesign — подпись приложений»Все macOS приложения должны быть подписаны для работы на современных Mac:
# Проверить подписьcodesign -dv myapp.app # подробная информацияcodesign --verify myapp.app # проверить валидностьcodesign -dv --verbose=4 myapp.app # максимальная детализация
# Список сертификатовsecurity find-identity -p codesigning -v
# Подписать приложениеcodesign --force --sign "Developer ID" myapp.appcodesign --force --sign "-" myapp.app # ad-hoc подпись (локально)
# Snip атрибутовcodesign -d --entitlements :- myapp.app # список entitlements
# spctl — проверка Gatekeeperspctl -a -v myapp.app # проверить разрешение Gatekeeperlaunchctl — управление службами
Заголовок раздела «launchctl — управление службами»launchctl управляет службами (LaunchAgents и LaunchDaemons) — аналог systemctl на Linux.
# Список службlaunchctl list # все запущенные агентыlaunchctl list | grep com.apple # системные агенты
# Управление службойlaunchctl load ~/Library/LaunchAgents/com.myapp.plist # загрузитьlaunchctl unload ~/Library/LaunchAgents/com.myapp.plist # выгрузитьlaunchctl start com.myapp.server # запуститьlaunchctl stop com.myapp.server # остановить
# Новый синтаксис (macOS 10.10+)launchctl bootstrap gui/$UID ~/Library/LaunchAgents/com.myapp.plistlaunchctl bootout gui/$UID/com.myappПример LaunchAgent для периодического запуска скрипта:
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"><plist version="1.0"><dict> <key>Label</key> <string>com.myapp.backup</string> <key>ProgramArguments</key> <array> <string>/bin/bash</string> <string>/Users/user/scripts/backup.sh</string> </array> <key>StartCalendarInterval</key> <dict> <key>Hour</key> <integer>9</integer> <key>Minute</key> <integer>0</integer> </dict></dict></plist>plutil — работа с plist файлами
Заголовок раздела «plutil — работа с plist файлами»Plist (Property List) — формат данных macOS (XML или бинарный). Используется для настроек приложений.
# Конвертация форматовplutil -convert xml1 file.plist # в XMLplutil -convert binary1 file.plist # в бинарныйplutil -convert json file.plist # в JSONplutil -convert json -o - file.plist # JSON в stdout
# Проверка валидностиplutil file.plistplutil -lint file.plist # то же самое
# Чтение значенийplutil -p file.plist # распечатать красиво/usr/libexec/PlistBuddy -c "Print :CFBundleVersion" Info.plist
# Изменение значенийplutil -replace key -string "value" file.plistplutil -replace port -integer 8080 config.plistdefaults — настройки приложений
Заголовок раздела «defaults — настройки приложений»defaults читает и изменяет настройки приложений macOS (хранятся в plist файлах):
# Читать настройкиdefaults read com.apple.dock # настройки Dockdefaults read com.apple.finder # настройки Finderdefaults read NSGlobalDomain # глобальные настройки
# Изменить настройки# Показывать скрытые файлы в Finderdefaults write com.apple.finder AppleShowAllFiles YESkillall Finder
# Скорость анимации Dockdefaults write com.apple.dock autohide-delay -float 0defaults write com.apple.dock autohide-time-modifier -float 0.5killall Dock
# Снимки экрана в PNG (по умолчанию)defaults write com.apple.screencapture type jpg
# Показывать все расширения файловdefaults write NSGlobalDomain AppleShowAllExtensions -bool truekillall Finder
# Отключить автозамену при вводеdefaults write NSGlobalDomain NSAutomaticSpellingCorrectionEnabled -bool false
# Сбросить к значениям по умолчаниюdefaults delete com.apple.dock autohide-delayПрактика
Заголовок раздела «Практика»# 1. Проверь установку Command Line Toolsxcode-select -p
# 2. Версия компилятораxcrun clang --version
# 3. Посмотри запущенные службы (LaunchAgents)launchctl list | grep -v "com.apple" | head -20
# 4. Измени настройку Finder — показать скрытые файлыdefaults write com.apple.finder AppleShowAllFiles YESkillall Finder# Теперь ты видишь .DS_Store, .gitignore и прочие скрытые файлы
# 5. Вернуть обратноdefaults write com.apple.finder AppleShowAllFiles NOkillall Finder
# 6. Посмотри настройки Dockdefaults read com.apple.dock | head -30
# 7. Конвертируй plist в JSONplutil -convert json -o - /System/Library/CoreServices/SystemVersion.plist
# 8. Создай простой LaunchAgent для напоминания# (расширенная практика — создай plist и загрузи через launchctl)Инструменты разработчика macOS дают глубокий контроль над системой. Особенно полезны defaults для тонкой настройки и launchctl для автоматизации!