Я хотел бы написать сценарий установки инструментов командной строки Xcode.
На Маверикс,
xcode-select --install
откроет диалоговое окно, предлагающее пользователю установить, но я хотел бы запустить установку без диалогового окна, например, с помощью softwareupdate
команды.
Есть ли способ сделать это?
Редактировать:
В частности, xcode-select --install
запускает приложение, которое загружает и устанавливает инструменты, не требуя от пользователя загрузки их вручную или наличия учетной записи разработчика Apple. Кажется, для /System/Library/CoreServices/Install Command Line Developer Tools.app
этого используется.
Я хотел бы использовать тот же механизм, что и Apple, но без графического интерфейса. Я не хочу вручную загружать .dmg, содержащий инструменты, так как это кажется хрупким. Apple предоставляет несколько других инструментов командной строки, таких как softwareupdate
и install
, которые загружают или устанавливают программное обеспечение непосредственно из Apple, и я ищу то же самое для этого типа дистрибутива.
Хотел бы я претендовать на признание этого, но я нашел его погребенным в https://github.com/chcokr/osx-init/blob/master/install.sh.
Это работало на моей безголовой виртуальной машине 10.10 без авторизованного пользовательского интерфейса. Обновления применяются для совместимости как минимум с 10.9-10.14
touch /tmp/.com.apple.dt.CommandLineTools.installondemand.in-progress;
PROD=$(softwareupdate -l |
grep "\*.*Command Line" |
head -n 1 | awk -F"*" '{print $2}' |
sed -e 's/^ *//' |
tr -d '\n')
softwareupdate -i "$PROD" --verbose
rm /tmp/.com.apple.dt.CommandLineTools.installondemand.in-progress
Это предполагает, что у вас есть только 1 результат softwareupdate -l | grep "\*.*Command Line"
- если это возвращает несколько версий, вам может потребоваться более конкретная логика. (у меня нет репродукции)
один вариант, который, кажется, работает (ограниченное тестирование) 10.10-10.14 (10.9 не возвращает номер версии osx в имени инструментов cli... так что это там не работает):
PROD=$(softwareupdate -l |
grep "\*.*Command Line.*$(sw_vers -productVersion|awk -F. '{print $1"."$2}')" |
head -n 1 | awk -F"*" '{print $2}' |
sed -e 's/^ *//' |
tr -d '\n')
несколько примеров результатов:
* Command Line Tools (OS X Mavericks)-6.2
* Command Line Tools (OS X 10.10) for Xcode-7.2
* Command Line Tools (macOS El Capitan version 10.11) for Xcode-8.2
* Command Line Tools (macOS High Sierra version 10.13) for Xcode-10.1
* Command Line Tools (macOS Mojave version 10.14) for Xcode-10.1
Загрузите пакет инструментов командной строки с сайта Apple Developer .
Монтируем загруженный 1 DMG:
hdiutil attach "command_line_tools_os_x_mountain_lion_for_xcode__october_2013.dmg"
Запустите установщик через командную строку:
cd "/Volumes/Command Line Tools (Mountain Lion)"
installer -verbose -pkg "Command Line Tools (Mountain Lion).mkpg" -target /
Когда закончите, размонтируйте DMG и удалите загрузку.
Извлеките DMG 2 .
cd /
hdiutil detach /dev/disk3s2
Удалите ДМГ.
rm "command_line_tools_os_x_mountain_lion_for_xcode__october_2013.dmg"
1 На момент написания загруженный DMG и имя пакета являются точными, однако в будущем это имя может измениться. Не забудьте изменить команду (или использовать табуляцию), чтобы заполнить соответствующую часть команды.
2 Если команда не работает, проверьте, соответствует ли диск имени монтирования (согласно mount
).
Попытка очистить стиль и логику принятого ответа, сделав его максимально независимым от версии, используя softwareupdate
его полную мощность и введя повторно используемую os
переменную:
#!/bin/bash
# Requires root
os=$(sw_vers -productVersion | awk -F. '{print $1 "." $2}')
if softwareupdate --history | grep --silent "Command Line Tools.*${os}"; then
echo 'Command-line tools already installed.'
else
echo 'Installing Command-line tools...'
in_progress=/tmp/.com.apple.dt.CommandLineTools.installondemand.in-progress
touch ${in_progress}
product=$(softwareupdate --list | awk "/\* Command Line.*${os}/ { sub(/^ \* /, \"\"); print }")
softwareupdate --verbose --install "${product}" || echo 'Installation failed.' 1>&2 && rm ${in_progress} && exit 1
rm ${in_progress}
echo 'Installation succeeded.'
fi
Альтернативой является использование этого яблочного скрипта, который я написал:
https://gist.github.com/brysgo/9007731
do shell script "xcode-select --install"
do shell script "sleep 1"
tell application "System Events"
tell process "Install Command Line Developer Tools"
keystroke return
click button "Agree" of window "License Agreement"
end tell
end tell
xcode-select --install
sleep 1
osascript <<EOD
tell application "System Events"
tell process "Install Command Line Developer Tools"
keystroke return
click button "Agree" of window "License Agreement"
end tell
end tell
EOD
Я обнаружил, что если вы установите Home Brew, он автоматически установит инструменты командной строки.
Я проверил это, используя этот бродячий образ .
Выполните следующую команду, чтобы установить Homebrew , и при этом установите инструменты командной строки.
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
Это то, что я использую, частично на основе ответа brysgo.
sudo sqlite3 /Library/Application\ Support/com.apple.TCC/TCC.db \
"INSERT or REPLACE INTO access(service,client,client_type,allowed,prompt_count) VALUES('kTCCServiceAccessibility','com.apple.Terminal',0,1,1);"
if [[ "$(xcode-select -p)" == "" ]]; then
printf "\n### Installing Xcode command line tools\n"
xcode-select --install
sleep 2
osascript <<EOD
tell application "System Events"
tell process "Install Command Line Developer Tools"
click button "Install" of window ""
click button "Agree" of window "License Agreement"
repeat until exists button "Done" of window ""
delay 1
end repeat
click button "Done" of window ""
end tell
end tell
EOD
fi
обновление: Apple продолжает добавлять новые столбцы в базу данных доступа, вам нужно указать только значения для первых 5, обновив код, чтобы отразить это.
РЕДАКТИРОВАТЬ (2021-2022): серверы Apple теперь отвечают 302
перенаправлением наhttps://developer.apple.com/unauthorized/
Этот короткий отрывок из моего сценария macOSbootstrap.sh
был протестирован по состоянию на декабрь 2021 года.
# Try the AppleScript automation method rather than relying on manual .xip / .dmg download & mirroring
# Note: Apple broke automated Xcode installer downloads. Now requires manual Apple ID sign-in.
# Source: https://web.archive.org/web/20211210020829/https://techviewleo.com/install-xcode-command-line-tools-macos/
xcode-select --install
sleep 1
osascript <<-EOD
tell application "System Events"
tell process "Install Command Line Developer Tools"
keystroke return
click button "Agree" of window "License Agreement"
end tell
end tell
EOD
Еще несколько альтернатив можно найти в этих ответах:
Вы можете загрузить пакеты XCode 4.x CLTools с их официального сайта загрузки по прямым ссылкам.
Вот сценарий , который автоматизирует процесс установки для вас 1 .
РЕДАКТИРОВАТЬ (2021–2022): серверы Apple теперь отвечают 302
перенаправлением https://developer.apple.com/unauthorized/
при попытке загрузить пакеты CLT. Исходя из этого, Apple прервала все автоматические прямые загрузки без предварительной регистрации с помощью Apple ID. Количество обручей, через которые скрипт должен пройти, чтобы войти в систему, сохранить файлы cookie и загрузить, является запредельным.
Чтобы найти обновленные ссылки на инструменты, вы можете использовать эту команду:
curl -Lks https://devimages.apple.com.edgekey.net/downloads/xcode/simulators/index-3905972D-B609-49CE-8D06-51ADC78E07BC.dvtdownloadableindex | plutil -convert json -o - - | python -mjson.tool | less
РЕДАКТИРОВАТЬ (2021-2022): этот URL-адрес теперь имеет неработающие SSL-сертификаты, а последняя доступная версия Xcode.CLTools.10.8 version 2014.4
( command_line_tools_for_osx_mountain_lion_april_2014.dmg
)...
Примечание. В curl
приведенную выше команду теперь -k
добавлен флаг, позволяющий обойти эту проблему с проверкой сертификата. Имейте в виду, что -k / --insecure
флаг параметра командной строки будет обходить проверки безопасности SSL-сертификата. Это небезопасно, и с помощью цепочки доверия PKI + CA невозможно проверить, что этот домен заслуживает доверия и по-прежнему принадлежит Apple. Рекомендуется использовать альтернативное xcode-select --install
+ osascript
решение выше.
[1] Пожалуйста, не злоупотребляйте/не перегружайте их серверы
Вы можете обнаружить, что проще сначала войти на сайт загрузки Apple Developer и загрузить последние доступные там инструменты командной строки. Затем вы можете разместить его .dmg
на своем собственном сервере репозитория пакетов и иметь возможность надежно установить его .dmg
на многих компьютерах hdiutil
без необходимости входа в систему на сайте developer.apple.com.
По состоянию на 10.06.2015 ссылка на последние инструменты командной строки dmg
:
http://adcdownload.apple.com/Developer_Tools/Command_Line_Tools_OS_X_10.10_for_Xcode_6.3.2/commandlinetoolsosx10.10forxcode6.3.2.dmg
РЕДАКТИРОВАТЬ (2021-2022): этот URL-адрес больше не работает... Серверы Apple теперь отвечают 302
перенаправлением, https://developer.apple.com/unauthorized/
если вы не вошли в систему с Apple ID.
См. альтернативу xcode-select --install
+ osascript
решение выше.
dmg
и локально скопировать основные части ответа в этот ответ.Мне пришлось немного изменить код для Monterey 12.0.1.
#!/bin/bash
echo "Checking Xcode CLI tools"
# Only run if the tools are not installed yet
# To check that try to print the SDK path
xcode-select -p &> /dev/null
if [ $? -ne 0 ]; then
echo "Xcode CLI tools not found. Installing them..."
touch /tmp/.com.apple.dt.CommandLineTools.installondemand.in-progress;
PROD=$(softwareupdate -l |
grep "\*.*Command Line" |
tail -n 1 | sed 's/^[^C]* //')
softwareupdate -i "$PROD" --verbose;
else
echo "Xcode CLI tools OK"
fi
Колин С.
также