Jak mogę zainstalować Narzędzia wiersza poleceń całkowicie z wiersza poleceń?

44

Chciałbym napisać skrypt instalacji narzędzi wiersza polecenia Xcode.

Na Mavericks

xcode-select --install

otworzy okno dialogowe monitujące użytkownika do instalacji, ale chciałbym uruchomić instalację bez okna dialogowego, na przykład za pomocą softwareupdatepolecenia.

Czy jest na to sposób?

Edytować:

W szczególności xcode-select --installuruchamia aplikację, która pobiera i instaluje narzędzia bez konieczności ręcznego pobierania ich przez użytkownika lub posiadania konta Apple Developer. Wygląda na /System/Library/CoreServices/Install Command Line Developer Tools.appto, że tego używa .

Chciałbym użyć tego samego mechanizmu, który jest Apple, ale bez GUI. Nie chcę ręcznie pobierać pliku .dmg zawierającego narzędzia, ponieważ wydaje się to kruche. Apple udostępnia kilka innych narzędzi wiersza polecenia, takich jak softwareupdatei do installpobierania lub instalowania oprogramowania bezpośrednio z Apple, i szukam tego samego dla tego typu dystrybucji.

również
źródło
1
Czy próbujesz to zrobić dla wewnętrznego skryptu lub jakiejś dystrybucji? Pytam dlatego, że narzędzia programistyczne wymagają (bezpłatnego) konta programisty, aby uzyskać do nich dostęp i rozpowszechniać je poza tym, co naruszałoby umowę licencyjną Apple.
Colin C.
1
@ColinC. xcode-select --install nie wymaga konta Apple Developer. Może wymagać akceptacji umowy licencyjnej przed użyciem narzędzi, ale pobiera je bez konta.
również

Odpowiedzi:

30

Chciałbym móc ubiegać się o kredyt na ten, ale znalazłem go pochowany w https://github.com/chcokr/osx-init/blob/master/install.sh

Działa to na mojej bezgłowej maszynie wirtualnej 10.10 bez zalogowanego interfejsu użytkownika. Zastosowano aktualizacje zgodności z co najmniej 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

Zakłada się, że masz tylko 1 wynik softwareupdate -l | grep "\*.*Command Line"- jeśli zwraca wiele wersji, być może potrzebujesz bardziej szczegółowej logiki. (Nie mam skrzynki z repro)

jedna odmiana, która wydaje się działać (ograniczone testy) w dniu 10.10-10.14 (10.9 nie zwraca numeru wersji osx w nazwie narzędzia cli .. więc to nie działa):

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')

kilka przykładowych wyników:

* 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
zapalony
źródło
1
Ten scenariusz wydaje się być pierwotnym źródłem kodu i posiada dodatkowy kod, który będzie działał na wersji Mac OS X 10.9 poniżej: github.com/timsutton/osx-vm-templates/blob/...
Finn
1
niestety jest to dość typowe, że tego typu rzeczy są łamane przy każdym nowym wydaniu, więc żadna prawdziwa niespodzianka .....
zapalony
3
W przypadku wersji 10.12 (Sierra) wszystko, co musiałem zmienić, to „-v”, aby stać się „--verbose”
macetw
3
Świetna odpowiedź, działa dla mnie w Sierra! :-) Jednak możesz chcieć rm /tmp/.com.apple.dt.CommandLineTools.installondemand.in-progresspo uruchomieniu softwareupdate -i ... , w przeciwnym razie kolejne połączenia będą softwareupdate -lwyświetlane Command Line Tools ... jako dostępna aktualizacja. Ta (przypuszczalnie) aktualizacja nie wydaje się pokazywana w App Store, być może dlatego, że softwareupdate -lzawiera tylko aktualizacje „systemowe”, a nie aktualizacje aplikacji.
ssc,
1
@thaimin Nie mam żadnych przypadków repro, które zwracają wiele wyników - ale opublikowałem aktualizację z możliwą poprawką dla Ciebie. jednym z wyzwań jest to, że jabłko przez lata było bardzo niespójne z ich nazwami, więc naprawdę nie ma nic super spójnego do sortowania lub filtrowania ...
zapalony
18
  1. Pobierz pakiet narzędzi wiersza polecenia ze strony Apple Developer .

  2. Zamontuj pobrany 1 DMG:

    hdiutil attach "command_line_tools_os_x_mountain_lion_for_xcode__october_2013.dmg"
  3. Uruchom instalator za pomocą wiersza polecenia:

    cd "/Volumes/Command Line Tools (Mountain Lion)"
    installer -verbose -pkg "Command Line Tools (Mountain Lion).mkpg" -target /
  4. Po zakończeniu odmontuj DMG i usuń pobrany plik.

    1. Wysuń DMG 2 .

      cd /
      hdiutil detach /dev/disk3s2
    2. Usuń DMG.

      rm "command_line_tools_os_x_mountain_lion_for_xcode__october_2013.dmg"

1 W momencie pisania, pobrany plik DMG i nazwa pakietu są dokładne, jednak w przyszłości nazwa może ulec zmianie. Pamiętaj, aby zmienić polecenie (lub użyć klawisza tabulacji), aby wypełnić odpowiednią część polecenia.
2 Jeśli polecenie nie działa, sprawdź, czy dysk odpowiada nazwie montowania (zgodnie z mount).

grg
źródło
1
Chciałbym, aby był to dowód na przyszłość i nie chcę dostarczać własnej kopii obrazu dysku z narzędziami. xcode-select - zainstaluj pliki do pobrania i instaluje narzędzia dla użytkownika i nie wymaga ADC. Chcę to zrobić dokładnie, ale bez GUI.
także
Znalazłem punkty 1 i 2 bardzo przydatne do instalowania narzędzi sprzętowych we / wy.
rstackhouse
6

Alternatywą jest użycie tego napisanego przeze mnie skryptu jabłkowego:

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
źródło
1
macos 10.11 Występuje błąd „Osascript nie jest dozwolony przy dostępie wspomaganym”
ClintM
6

Próba oczyszczenia stylu i logiki przyjętej odpowiedzi, sprawiając, że jest ona możliwie najbardziej niezależna od wersji, wykorzystując softwareupdatepełną pojemność i wprowadzając oszmienną wielokrotnego użytku :

#!/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
źródło
tylko uwaga: filtr sw_vers nie działa w różnych wersjach wcześniejszych niż 10.10. (Nie mogę rozmawiać z 10.11–10.13, testowałem dzisiaj tylko w 10.9 10.10 i 10.14) (zobacz moją zaktualizowaną odpowiedź na kilka przykładów)
chętny
2

Tego używam, częściowo w oparciu o odpowiedź 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

aktualizacja: Apple ciągle dodaje nowe kolumny do bazy danych dostępu, musisz tylko określić wartości dla pierwszych 5, zaktualizował kod, aby to odzwierciedlić.

Cyberbeni
źródło
1

Kilka odpowiedzi można znaleźć w tych odpowiedziach:

Pobierz narzędzia wiersza polecenia XCode

Możesz pobrać pakiety XCode 4.x CLTools z ich oficjalnej strony pobierania poprzez bezpośrednie linki.

Oto skrypt , który zautomatyzuje proces instalacji dla Ciebie 1 .

Aby znaleźć zaktualizowane łącza do narzędzi, możesz użyć tego polecenia:

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] Proszę nie nadużywaj / przeciążaj swoich serwerów

Może się okazać, że łatwiej jest najpierw zalogować się do witryny pobierania dla programistów Apple i pobrać najnowsze dostępne tam narzędzia wiersza poleceń. Następnie możesz hostować .dmgna własnym serwerze repozytorium pakietów i mieć możliwość niezawodnej instalacji .dmgna wielu komputerach hdiutilbez konieczności logowania się na developer.apple.com.

Według stanu na 06.10.2015 link do najnowszych narzędzi wiersza poleceń dmgto:

http://adcdownload.apple.com/Developer_Tools/Command_Line_Tools_OS_X_10.10_for_Xcode_6.3.2/commandlinetoolsosx10.10forxcode6.3.2.dmg

TrinitronX
źródło
Chociaż ten link może odpowiedzieć na pytanie, lepiej jest dołączyć tutaj istotne części odpowiedzi i podać link w celach informacyjnych. Odpowiedzi zawierające tylko łącze mogą stać się nieprawidłowe, jeśli połączona strona ulegnie zmianie.
grg
1
@grgarside: Trwało trochę czasu, aby zaktualizować ten skrypt za pomocą najnowszego Yosemite / XCode 6.3.2 CLT dmg, i skopiowałem podstawowe części odpowiedzi lokalnie do tej odpowiedzi.
TrinitronX
@grgarside: Zdałem sobie sprawę z problemu z linkowaniem i że skrypt był prawdopodobnie nieaktualny, ale nie miałem czasu na aktualizację tego samego dnia, w którym pierwotnie opublikowałem. Chciałem tylko dać te linki jako dobre miejsce do rozpoczęcia i jako notatkę dla siebie, aby wrócić i zaktualizować i przetestować ponownie.
TrinitronX
1

Odkryłem, że jeśli zainstalujesz Home Brew, automatycznie zainstaluje narzędzia wiersza poleceń.

Przetestowałem to za pomocą tego błędnego obrazu .

Uruchom następujące polecenie, aby zainstalować Homebrew , a tym samym zainstaluj Narzędzia wiersza polecenia.

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
  • Wiem, że pierwotne pytanie dotyczyło tylko instalacji narzędzi wiersza polecenia, ale obecnie nie znam żadnego komputera Mac, który nie ma na nim zainstalowanego Home Brew.
Nathan F.
źródło
Jeśli spojrzysz na github.com/Homebrew/install/blob/… , zobaczysz, że Homewbrew używa techniki podobnej do tej opisanej w odpowiedziach (na przykład apple.stackexchange.com/a/195963/66169 ) na to pytanie
Anon