Wie kann ich die Befehlszeilentools vollständig von der Befehlszeile aus installieren?


44

Ich möchte die Installation der Xcode Command Line Tools skripten.

Auf Außenseiter,

xcode-select --install

öffnet ein Dialogfeld, in dem der Benutzer zur Installation aufgefordert wird. Ich möchte die Installation jedoch auch ohne das Dialogfeld wie mit dem softwareupdateBefehl auslösen .

Gibt es eine Möglichkeit, dies zu tun?

Bearbeiten:

Insbesondere xcode-select --installstartet eine Anwendung , die Downloads und die Tools installiert , ohne dass der Benutzer , um sie manuell herunterladen oder ein Apple - Entwicklerkonto hat. Es scheint zu verwenden /System/Library/CoreServices/Install Command Line Developer Tools.app, um dies zu tun.

Ich möchte den gleichen Mechanismus wie Apple verwenden, aber ohne die GUI. Ich möchte die .dmg mit den Tools nicht manuell herunterladen müssen, da dies anfällig erscheint. Apple stellt mehrere anderen Kommandozeilen - Tools, wie softwareupdateund installdass Download oder Installation von Software direkt von Apple, und ich bin auf der Suche das gleiche für diese Art der Verteilung zu finden.


1
Versuchen Sie dies für ein internes Skript oder für eine Distribution? Der Grund, den ich frage, ist, dass die Entwicklertools ein (kostenloses) Entwicklerkonto erfordern, um auf sie zuzugreifen und sie außerhalb davon zu verteilen. Dies würde die Lizenzvereinbarung von Apple verletzen.
Colin C.

1
@ColinC. Für xcode-select --install ist kein Apple Developer-Konto erforderlich. Möglicherweise muss die Lizenzvereinbarung akzeptiert werden, bevor die Tools verwendet werden, sie werden jedoch ohne Konto heruntergeladen.
auch

Antworten:


30

Ich wünschte, ich könnte eine Gutschrift für diese beantragen, fand sie jedoch unter https://github.com/chcokr/osx-init/blob/master/install.sh vergraben

Dies funktionierte auf meiner 10.10 Headless-VM ohne angemeldete Benutzeroberfläche. Updates für Kompatibilität mit mindestens 10.9-10.14 beantragt

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

Dies setzt voraus, dass Sie nur 1 Ergebnis haben softwareupdate -l | grep "\*.*Command Line"- wenn dies mehrere Versionen zurückgibt, benötigen Sie möglicherweise eine spezifischere Logik. (Ich habe keinen Reprofall)

Eine Variation, die am 10.10.10.14 zu funktionieren scheint (eingeschränkte Tests) (10.9 gibt keine OSX-Versionsnummer im Namen der CLI-Tools zurück. Dies funktioniert dort also nicht.):

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

ein paar beispielergebnisse:

* 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
Dieses Skript wird die ursprüngliche Quelle für den Code zu sein und zusätzlichen Code hat, der auf Versionen von Mac OS X unter 10.9 funktionieren: github.com/timsutton/osx-vm-templates/blob/...
finn

1
Leider ist es ziemlich typisch für diese Art von Sachen, dass sie bei jeder Neuerscheinung kaputt gehen, also keine wirkliche Überraschung .....
gespannter

3
Für 10.12 (Sierra) musste ich hier nur ändern, damit "-v" zu "--verbose" wurde
macetw

3
Tolle Antwort, funktioniert bei mir auf Sierra! :-) Möglicherweise möchten Sie jedoch rm /tmp/.com.apple.dt.CommandLineTools.installondemand.in-progressnach dem Ausführen softwareupdate -i ... , ansonsten nachfolgende Aufrufe als verfügbares Update softwareupdate -lanzeigen Command Line Tools ... . Dieses (angebliche) Update wird anscheinend nicht im App Store angezeigt, möglicherweise weil softwareupdate -lnur "System" -Updates aufgelistet werden, keine Anwendungsupdates.
SSC

1
@thaimin Ich habe keine Reprofälle, die mehrere Ergebnisse zurückgeben - aber ich habe ein Update mit einem möglichen Fix für Sie gepostet. Eine der Herausforderungen ist , dass Apple sehr uneinheitlich war mit , wie sie diese im Laufe der Jahre nennen, so gibt es nichts , Super konsistent zu sortieren oder filtern wirklich ...
keen

18
  1. Laden Sie das Command Line Tools-Paket von der Apple Developer-Website herunter .

  2. Hänge das heruntergeladene 1 DMG ein:

    hdiutil attach "command_line_tools_os_x_mountain_lion_for_xcode__october_2013.dmg"
  3. Führen Sie das Installationsprogramm über die Befehlszeile aus:

    cd "/Volumes/Command Line Tools (Mountain Lion)"
    installer -verbose -pkg "Command Line Tools (Mountain Lion).mkpg" -target /
  4. Wenn Sie fertig sind, hängen Sie das DMG aus und löschen Sie den Download.

    1. DMG 2 auswerfen .

      cd /
      hdiutil detach /dev/disk3s2
    2. Löschen Sie die DMG.

      rm "command_line_tools_os_x_mountain_lion_for_xcode__october_2013.dmg"

1 Zum Zeitpunkt des Schreibens sind der heruntergeladene DMG- und Paketname korrekt, der Name kann sich jedoch in Zukunft ändern. Denken Sie daran, den Befehl zu ändern (oder die Tabulatorvervollständigung zu verwenden), um den relevanten Teil des Befehls auszufüllen.
2 Wenn der Befehl nicht funktioniert, prüfen Sie, ob der Datenträger mit dem Namen des Mount übereinstimmt (gemäß mount).


1
Ich möchte, dass dies zukunftssicher ist, und ich möchte keine eigene Kopie des Tools-Image bereitstellen müssen. xcode-select --install lädt die Tools für den Benutzer herunter und installiert sie, und es ist kein ADC erforderlich. Ich möchte genau das tun, aber ohne die GUI.
auch

Fand Punkt 1 und 2 sehr nützlich für die Installation der Hardware IO Tools.
Rstackhouse

6

Eine Alternative ist, dieses von mir geschriebene Applescript zu verwenden:

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
Unter MacOS 10.11 erhalte ich die Fehlermeldung "Bei assistivem Zugriff ist Javascript nicht erlaubt"
ClintM

6

Ein Versuch, den Stil und die Logik der akzeptierten Antwort zu bereinigen, sie so versionsunabhängig wie möglich zu gestalten, softwareupdateihre volle Kapazität zu nutzen und eine wiederverwendbare osVariable einzuführen :

#!/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

nur ein hinweis: der sw_vers filter funktioniert nicht auf verschiedenen releasen vor 10.10. (Ich kann nicht mit 10.11.10.13 sprechen, nur heute am 10.9.10.10 und 10.14 getestet) (siehe meine aktualisierte Antwort für einige Beispiele)
eifriger

2

Dies ist, was ich benutze, teilweise basierend auf Brysgos Antwort.

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

Update: Apple fügt der Access-Datenbank ständig neue Spalten hinzu. Sie müssen nur die Werte für die ersten 5 angeben und den Code entsprechend aktualisieren.


1

Einige weitere Alternativen finden Sie unter den folgenden Antworten:

Laden Sie die XCode-Befehlszeilentools herunter

Sie können die XCode 4.x CLTools-Pakete über direkte Links von der offiziellen Download-Site herunterladen.

Hier ist ein Skript , das den Installationsprozess für Sie automatisiert 1 .

Mit dem folgenden Befehl können Sie aktualisierte Links für die Tools suchen:

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] Bitte missbrauchen / überlasten Sie ihre Server nicht

Möglicherweise ist es einfacher, sich zuerst auf der Apple Developer Download Site anzumelden und die neuesten dort verfügbaren Befehlszeilentools herunterzuladen. Sie können dann den .dmgeigenen Paket-Repo-Server hosten und .dmgauf vielen Computern zuverlässig installieren, hdiutilohne sich bei developer.apple.com anmelden zu müssen.

Ab dem 10.06.2015 lautet der Link zu den neuesten Befehlszeilentools dmg:

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


Während dieser Link die Frage beantworten kann, ist es besser, die wesentlichen Teile der Antwort hier einzuschließen und den Link als Referenz bereitzustellen. Nur-Link-Antworten können ungültig werden, wenn sich die verlinkte Seite ändert.
grg

1
@grgarside: Es hat einige Zeit gedauert, dieses Skript mit dem neuesten Yosemite / XCode 6.3.2 CLT zu aktualisieren dmg, und wesentliche Teile der Antwort lokal in diese Antwort kopiert.
TrinitronX

@grgarside: Ich habe festgestellt, dass das Problem mit den Verknüpfungen und das Skript möglicherweise veraltet sind, hatte aber am selben Tag, an dem ich es ursprünglich gepostet habe, keine Zeit, es zu aktualisieren. Ich wollte diese Links nur als guten Startpunkt und als Hinweis an mich selbst geben, um zurückzukehren und die Dinge zu aktualisieren und erneut zu testen.
TrinitronX

1

Ich habe festgestellt, dass bei der Installation von Home Brew die Befehlszeilentools automatisch installiert werden.

Ich habe dies mit diesem Landstreicher-Bild getestet .

Führen Sie den folgenden Befehl aus, um Homebrew zu installieren , und installieren Sie dabei die Befehlszeilentools.

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
  • Ich weiß, dass bei der ursprünglichen Frage nur gefragt wurde, wie die Befehlszeilentools installiert werden sollen, aber ich kenne derzeit keinen Mac, auf dem Home Brew nicht installiert ist.

Wenn Sie sich github.com/Homebrew/install/blob/… ansehen, werden Sie feststellen, dass Homewbrew eine ähnliche Technologie verwendet wie die, die in den Antworten (zum Beispiel apple.stackexchange.com/a/195963/66169 ) auf diese Frage beschrieben ist
Anon
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.