Как полностью установить инструменты командной строки из командной строки?

Я хотел бы написать сценарий установки инструментов командной строки Xcode.

На Маверикс,

xcode-select --install

откроет диалоговое окно, предлагающее пользователю установить, но я хотел бы запустить установку без диалогового окна, например, с помощью softwareupdateкоманды.

Есть ли способ сделать это?

Редактировать:

В частности, xcode-select --installзапускает приложение, которое загружает и устанавливает инструменты, не требуя от пользователя загрузки их вручную или наличия учетной записи разработчика Apple. Кажется, для /System/Library/CoreServices/Install Command Line Developer Tools.appэтого используется.

Я хотел бы использовать тот же механизм, что и Apple, но без графического интерфейса. Я не хочу вручную загружать .dmg, содержащий инструменты, так как это кажется хрупким. Apple предоставляет несколько других инструментов командной строки, таких как softwareupdateи install, которые загружают или устанавливают программное обеспечение непосредственно из Apple, и я ищу то же самое для этого типа дистрибутива.

Вы пытаетесь сделать это для внутреннего скрипта или для какого-то дистрибутива? Причина, по которой я спрашиваю, заключается в том, что для доступа к инструментам разработчика требуется (бесплатная) учетная запись разработчика, и их распространение за пределами этого нарушит лицензионное соглашение Apple.
@КолинС. xcode-select --install не требует учетной записи разработчика Apple. Перед использованием инструментов может потребоваться принятие лицензионного соглашения, но они загружаются без учетной записи.

Ответы (8)

Хотел бы я претендовать на признание этого, но я нашел его погребенным в 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
Существует дополнительный шаг для запроса пароля sudo. Как это убрать?
Для Catalina команду нужно немного подправить softwareupdate -l | grep "*.*Командная строка" | хвост -n 1 | awk -F"*" '{print $2}' | sed -e 's/^ *//' | sed 's/Ярлык: //g' | тр -д '\п'
@jinbeomhong, вы можете применить бит setuid к скрипту (chmod u+s <scriptname>), и тогда вам не нужно будет вводить пароль sudo. Это может быть угрозой безопасности, если кто-то еще имеет доступ к вашему компьютеру, поэтому будьте осторожны.
  1. Загрузите пакет инструментов командной строки с сайта Apple Developer .

  2. Монтируем загруженный 1 DMG:

    hdiutil attach "command_line_tools_os_x_mountain_lion_for_xcode__october_2013.dmg"
    
  3. Запустите установщик через командную строку:

    cd "/Volumes/Command Line Tools (Mountain Lion)"
    installer -verbose -pkg "Command Line Tools (Mountain Lion).mkpg" -target /
    
  4. Когда закончите, размонтируйте DMG и удалите загрузку.

    1. Извлеките DMG 2 .

      cd /
      hdiutil detach /dev/disk3s2
      
    2. Удалите ДМГ.

      rm "command_line_tools_os_x_mountain_lion_for_xcode__october_2013.dmg"
      

1 На момент написания загруженный DMG и имя пакета являются точными, однако в будущем это имя может измениться. Не забудьте изменить команду (или использовать табуляцию), чтобы заполнить соответствующую часть команды.
2 Если команда не работает, проверьте, соответствует ли диск имени монтирования (согласно mount).

Я хотел бы, чтобы это было заделом на будущее, и я не хочу предоставлять свою собственную копию образа диска с инструментами. xcode-select --install загружает и устанавливает инструменты для пользователя, и для этого не требуется ADC. Я хочу сделать именно это, но без графического интерфейса.
Найденные пункты 1 и 2 очень полезны для установки Hardware IO Tools.

Попытка очистить стиль и логику принятого ответа, сделав его максимально независимым от версии, используя 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
просто примечание: фильтр sw_vers не работает в различных версиях до 10.10. (Я не могу говорить с 10.11-10.13, протестирован только сегодня на 10.9, 10.10 и 10.14) (см. мой обновленный ответ для некоторых примеров)
Это предполагает, что версия инструментов командной строки XCode такая же, как и версия macOS, и, по крайней мере, в моей системе (macOS 12.4, клиентские инструменты XCode 13.4) это не так.

Альтернативой является использование этого яблочного скрипта, который я написал:

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
macos 10.11 Я получаю сообщение об ошибке «osascript не разрешен для вспомогательного доступа»

Я обнаружил, что если вы установите Home Brew, он автоматически установит инструменты командной строки.

Я проверил это, используя этот бродячий образ .

Выполните следующую команду, чтобы установить Homebrew , и при этом установите инструменты командной строки.

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
  • Я знаю, что исходный вопрос касался только того, как установить инструменты командной строки, но в наши дни я не знаю ни одного Mac, на котором также не установлен Home Brew.
Если вы посмотрите на github.com/Homebrew/install/blob/… , вы увидите, что Homewbrew использует метод, аналогичный описанному в ответах (например , apple.stackexchange.com/a/195963/66169 ) на этот вопрос .

Это то, что я использую, частично на основе ответа 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/

Постапокалиптическое ... э... решение после 2021 года

Этот короткий отрывок из моего сценария 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

Старые решения (до 2021 г.)

Еще несколько альтернатив можно найти в этих ответах:

Скачать инструменты командной строки XCode

Вы можете загрузить пакеты 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решение выше.

Хотя эта ссылка может ответить на вопрос, лучше включить сюда основные части ответа и предоставить ссылку для справки. Ответы, содержащие только ссылки, могут стать недействительными, если связанная страница изменится.
@grgarside: потребовалось некоторое время, чтобы обновить этот скрипт последней версией Yosemite / XCode 6.3.2 CLT dmgи локально скопировать основные части ответа в этот ответ.
@grgarside: я понял проблему со ссылками и то, что скрипт, вероятно, устарел, но у меня не было времени обновить его в тот же день, когда я впервые опубликовал. Я просто хотел дать эти ссылки как хорошее место для начала и как заметку для себя, чтобы вернуться, обновить и снова протестировать вещи.

Мне пришлось немного изменить код для 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
Это не дает ответа на вопрос. Когда у вас будет достаточно репутации , вы сможете комментировать любой пост ; вместо этого предоставьте ответы, которые не требуют разъяснений от спрашивающего . - Из обзора