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

35

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

На Маверикс,

xcode-select --install

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

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

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

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

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

also
источник
1
Вы пытаетесь сделать это для внутреннего скрипта или для какого-то распространения? Я спрашиваю, потому что инструментальные средства разработчика требуют (бесплатной) учетной записи разработчика для доступа и их распространения за пределами, что нарушило бы лицензионное соглашение Apple.
Colin C.
1
@ColinC. xcode-select --install не требует учетной записи Apple Developer. Может потребоваться принятие лицензионного соглашения перед использованием инструментов, но он загружает их без учетной записи.
also

Ответы:

24

Хотел бы я претендовать на кредит на этот, но я нашел его похороненным в 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 Mojave version 10.14) for Xcode-10.1
keen
источник
1
Этот скрипт является исходным кодом для кода и содержит дополнительный код, который будет работать в версиях Mac OS X ниже 10.9: github.com/timsutton/osx-vm-templates/blob/...
finn
1
к сожалению, это довольно типично для такого типа вещей, которые ломаются в каждом новом релизе, так что нет ничего удивительного
keen
3
Для 10.12 (Сьерра) все, что мне нужно было изменить, это чтобы "-v" стал "--verbose"
macetw
3
Отличный ответ, у меня работает на Сьерра! :-) Однако вы можете захотеть rm /tmp/.com.apple.dt.CommandLineTools.installondemand.in-progress после запуска softwareupdate -i ... в противном случае последующие вызовы softwareupdate -l дисплей Command Line Tools ... как доступное обновление. Это (предполагаемое) обновление не отображается в App Store, возможно, из-за softwareupdate -l перечисляет только «системные» обновления, а не обновления приложений.
ssc
1
@thaimin У меня нет никаких репроцессов, которые бы возвращали несколько результатов, но я опубликовал обновление с возможным исправлением для вас. одна из проблем заключается в том, что на протяжении многих лет яблоки были очень несовместимы с тем, как они их называют, поэтому на самом деле нет ничего сверхпоследовательного для сортировки или фильтрации ...
keen
19
  1. Загрузите пакет инструментов командной строки с Сайт разработчика Apple ,

  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. Удалить DMG.

      rm "command_line_tools_os_x_mountain_lion_for_xcode__october_2013.dmg"
      

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

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

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

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

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

Это то, что я использую, частично основываясь на ответе brysgo

sudo sqlite3 /Library/Application\ Support/com.apple.TCC/TCC.db \
  "INSERT or REPLACE INTO access
   VALUES('kTCCServiceAccessibility','com.apple.Terminal',0,1,1,NULL,NULL);"

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
Cyberbeni
источник
1

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

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

Вы можете скачать пакеты XCode 4.x CLTools со своего официального сайта загрузки по прямым ссылкам.

Вот скрипт это автоматизирует процесс установки для вас 1 ,

Чтобы найти обновленные ссылки для инструментов, вы можете использовать эту команду:

curl -Ls https://devimages.apple.com.edgekey.net/downloads/xcode/simulators/index-3905972D-B609-49CE-8D06-51ADC78E07BC.dvtdownloadableindex | plutil -convert json -o - - | python -mjson.tool | less

[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

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

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

Я проверил это с помощью это бродячее изображение ,

Запустите следующую команду для установки Homebrew и при этом установите инструменты командной строки.

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