Як я можу повністю встановити Інструменти командного рядка з командного рядка?


44

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

На Мавериках,

xcode-select --install

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

Чи є спосіб це зробити?

Редагувати:

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

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


1
Ви намагаєтесь зробити це для внутрішнього сценарію чи для якогось розповсюдження? Я запитую причину тому, що інструменти розробника вимагають (безкоштовного) облікового запису розробника для доступу та розповсюдження їх поза межами, що порушило б ліцензійну угоду Apple.
Колін К.

1
@ColinC. xcode-select - для встановлення не потрібен обліковий запис розробника Apple. Може знадобитися прийняття ліцензійної угоди до використання інструментів, але вони завантажують їх без акаунта.
також

Відповіді:


30

Хочеться, щоб я міг вимагати кредит за цей, але знайшов його похованим на https://github.com/chcokr/osx-init/blob/master/install.sh

Це працювало на моєму 10.10 безголовому VM без увімкненого інтерфейсу користувача. Оновлення застосовано для сумісності принаймні з 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

1
Цей сценарій є оригінальним джерелом коду та має додатковий код, який працюватиме на версіях Mac OS X нижче 10.9: github.com/timsutton/osx-vm-templates/blob/…
фін

1
на жаль, досить типово, щоб цей тип матеріалів був порушений кожен новий реліз, тому справжнього сюрпризу немає .....
захоплюється

3
За 10.12 (Сьєрра) тут все, що мені довелося змінити, - це "-v", щоб стати "
--вербоза

3
Чудова відповідь, працює для мене на Сьєррі! :-) Однак, можливо, ви захочете rm /tmp/.com.apple.dt.CommandLineTools.installondemand.in-progressпісля запуску softwareupdate -i ... , інакше наступні дзвінки наsoftwareupdate -l відображатимуться Command Line Tools ... як доступне оновлення. Це (передбачуване) оновлення, здається, не відображається в App Store, можливо, тому що softwareupdate -lлише переліки "системних" оновлень, а не оновлення програм.
ssc

1
@thaimin Я не маю жодних випадків докорів, які дають кілька результатів, але я опублікував оновлення з можливим виправленням для вас. Одне з викликів полягає в тому, що яблуко було дуже невідповідним тому, як їх називають протягом багатьох років, тому насправді немає нічого супер послідовного сортувати чи фільтрувати ...
захоплюється

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

      rm "command_line_tools_os_x_mountain_lion_for_xcode__october_2013.dmg"

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


1
Я хотів би, щоб це було підтвердженням у майбутньому, і я не хочу надавати власну копію образу диска інструментів. xcode-select - встановіть завантаження та встановлення інструментів для користувача, і для нього не потрібен АЦП. Я хочу зробити саме це, але без GUI.
також

Знайдені пункти 1 і 2 дуже корисні для встановлення апаратних засобів IO.
rstackhouse

6

Альтернативою є використання цього яблучного сценарію, який я написав:

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

1
macos 10.11 Я отримую помилку "osascript заборонений у допоміжному доступі"
ClintM

6

Спроба очистити стиль та логіку прийнятої відповіді, зробивши її максимально незалежною від версій, використовуючи 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) (див. Мою оновлену відповідь для деяких прикладів)
захоплюється

2

Це те, що я використовую, почасти ґрунтуючись на відповіді 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, оновивши код, щоб це відобразити.


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 і завантажити найновіші інструменти командного рядка, доступні там. Потім ви можете розмістити хост .dmgна своєму власному сервері репо-пакетів і зможете надійно встановити .dmgна багатьох машинахhdiutil не входячи на сторінку developer.apple.com.

Станом на 06.10.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


Хоча це посилання може відповісти на питання, краще включити сюди суттєві частини відповіді та надати посилання для довідки. Відповіді лише на посилання можуть стати недійсними, якщо пов’язана сторінка зміниться.
гр

1
@grgarside: Знадобився деякий час, щоб оновити цей сценарій найновішим Yosemite / XCode 6.3.2 CLT dmgта скопіював основні частини відповіді локально на цю відповідь.
TrinitronX

@grgarside: Я зрозумів, що проблема з посиланням є, що сценарій, ймовірно, застарів, але не встиг оновити його в той же день, який я спочатку опублікував. Я просто хотів надати ці посилання як гарне місце для початку і як зауваження до себе, щоб повернутися назад, оновити та перевірити речі ще раз.
TrinitronX

1

Я виявив, що якщо встановити Home Brew, він автоматично встановить інструменти командного рядка.

Я перевірив це за допомогою цього бродячого зображення .

Виконайте наступну команду, щоб встановити Homebrew , і тим самим встановіть Інструменти командного рядка.

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
  • Я знаю, що в оригінальному запитанні було задано лише те, як встановити інструменти командного рядка, але я не знаю жодного мака в ці дні, на якому також не встановлений Home Brew.

Якщо ви подивитесь на github.com/Homebrew/install/blob/…, ви побачите, що Homewbrew використовує аналогічний метод, який описаний у відповідях (наприклад, apple.stackexchange.com/a/195963/66169 ) до цього питання
Anon
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.