Come posso installare completamente gli strumenti da riga di comando dalla riga di comando?


44

Vorrei scrivere script per l'installazione degli strumenti da riga di comando Xcode.

Su Mavericks,

xcode-select --install

aprirà una finestra di dialogo che richiede all'utente di installare, ma vorrei avviare l'installazione senza la finestra di dialogo, come usare il softwareupdatecomando.

C'è un modo per fare questo?

Modificare:

In particolare, xcode-select --installavvia un'applicazione che scarica e installa gli strumenti senza richiedere all'utente di scaricarli manualmente o di avere un account Apple Developer. Sembra usare /System/Library/CoreServices/Install Command Line Developer Tools.appper fare questo.

Vorrei usare lo stesso meccanismo di Apple, ma senza la GUI. Non voglio scaricare manualmente il .dmg contenente gli strumenti poiché questo sembra fragile. Apple fornisce molti altri strumenti da riga di comando, come softwareupdatee installche scaricano o installano software direttamente da Apple, e sto cercando di trovare lo stesso per questo tipo di distribuzione.


1
Stai cercando di farlo per uno script interno o per un qualche tipo di distribuzione? Il motivo per cui lo chiedo è perché gli strumenti per sviluppatori richiedono un account sviluppatore (gratuito) per accedervi e distribuirli al di fuori di ciò violerebbe l'accordo di licenza di Apple.
Colin C.,

1
@ColinC. xcode-select: install non richiede un account Apple Developer. Potrebbe essere necessario accettare l'accordo di licenza prima di utilizzare gli strumenti, ma li scarica senza un account.
anche il

Risposte:


30

Vorrei poter rivendicare il merito per questo, ma l'ho trovato sepolto in https://github.com/chcokr/osx-init/blob/master/install.sh

Questo ha funzionato sulla mia VM senza testa 10.10 senza un'interfaccia utente connessa. Aggiornamenti richiesti per compatibilità con almeno il 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

Ciò presuppone che si ottenga solo 1 risultato softwareupdate -l | grep "\*.*Command Line": se restituisce più versioni, potrebbe essere necessaria una logica più specifica. (Non ho un caso di riprogrammazione)

una variante che sembra funzionare (test limitati) il 10.10-10.14 (10.9 non restituisce un numero di versione osx nel nome degli strumenti cli .. quindi questo non funziona lì):

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

alcuni risultati di esempio:

* 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
Questo script sembra essere la fonte originale del codice e ha un codice aggiuntivo che funzionerà su versioni di Mac OS X precedenti alla 10.9: github.com/timsutton/osx-vm-templates/blob/…
finn

1
purtroppo è abbastanza tipico per questo tipo di cose essere rotto ogni nuova versione, quindi nessuna vera sorpresa .....
appassionato

3
Per il 10.12 (Sierra), tutto ciò che dovevo cambiare qui era che "-v" diventasse "--verbose"
macetw,

3
Ottima risposta, funziona per me su Sierra! :-) Tuttavia, potresti volerlo eseguire rm /tmp/.com.apple.dt.CommandLineTools.installondemand.in-progressdopo l'esecuzione softwareupdate -i ... , altrimenti le chiamate successive verranno softwareupdate -lvisualizzate Command Line Tools ... come aggiornamento disponibile. Questo (presunto) aggiornamento non sembra essere mostrato nell'App Store, probabilmente perché softwareupdate -lelenca solo gli aggiornamenti "di sistema", non gli aggiornamenti dell'applicazione.
ssc,

1
@thaimin Non ho alcun caso di riprogrammazione che restituisca più risultati, ma ho pubblicato un aggiornamento con una possibile correzione per te. una delle sfide è che Apple è stata molto incoerente con il modo in cui le chiamano nel corso degli anni, quindi non c'è davvero nulla di super coerente su cui ordinare o filtrare ...
appassionato del

18
  1. Scarica il pacchetto Strumenti da riga di comando dal sito degli sviluppatori Apple .

  2. Montare il DMG 1 scaricato :

    hdiutil attach "command_line_tools_os_x_mountain_lion_for_xcode__october_2013.dmg"
  3. Esegui il programma di installazione tramite la riga di comando:

    cd "/Volumes/Command Line Tools (Mountain Lion)"
    installer -verbose -pkg "Command Line Tools (Mountain Lion).mkpg" -target /
    
  4. Al termine, smontare il DMG ed eliminare il download.

    1. Espellere il DMG 2 .

      cd /
      hdiutil detach /dev/disk3s2
      
    2. Elimina il DMG.

      rm "command_line_tools_os_x_mountain_lion_for_xcode__october_2013.dmg"

1 Al momento della scrittura, il DMG scaricato e il nome del pacchetto sono precisi, tuttavia in futuro il nome potrebbe cambiare. Ricordarsi di modificare il comando (o utilizzare il completamento con tabulazione) per compilare la parte pertinente del comando.
2 Se il comando non funziona, controllare che il disco corrisponda al nome del montaggio (come da mount).


1
Vorrei che questo fosse a prova di futuro e non voglio fornire la mia copia dell'immagine del disco degli strumenti. xcode-select: installa scarica e installa gli strumenti per l'utente e non richiede un ADC. Voglio fare esattamente questo, ma senza la GUI.
anche il

Trovati i punti 1 e 2 molto utili per l'installazione di Hardware IO Tools.
rstackhouse,

6

Un'alternativa è usare questo script di mele che ho scritto:

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 Viene visualizzato l'errore "Non è consentito JavaScript sull'accesso assistito"
ClintM

6

Un tentativo di ripulire lo stile e la logica della risposta accettata, rendendola il più indipendente possibile dalla versione, sfruttando softwareupdatetutta la sua capacità e introducendo una osvariabile riutilizzabile :

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

solo una nota: il filtro sw_vers non funziona su varie versioni prima del 10.10. (Non posso parlare al 10.11-10.13, testato solo oggi il 10.9 10.10 e 10.14) (vedi la mia risposta aggiornata per alcuni esempi)
acuto il

2

Questo è quello che uso, in parte basato sulla risposta di 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

aggiornamento: Apple continua ad aggiungere nuove colonne al database di accesso, devi solo specificare i valori per i primi 5, aggiornato il codice per riflettere questo.


1

Un paio di alternative possono essere trovate a queste risposte:

Scarica XCode Command Line Tools

Puoi scaricare i pacchetti XCode 4.x CLTools dal loro sito ufficiale di download tramite collegamenti diretti.

Ecco uno script che automatizzerà il processo di installazione per te 1 .

Per trovare collegamenti aggiornati per gli strumenti, è possibile utilizzare questo comando:

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] Per favore, non abusare / sovraccaricare i loro server

Potresti scoprire che è più semplice prima accedere al sito di download per sviluppatori Apple e scaricare gli ultimi strumenti da riga di comando disponibili lì. Puoi quindi ospitare il .dmgtuo repository di pacchetti sul tuo pacchetto ed essere in grado di installarlo in modo affidabile .dmgsu molte macchine hdiutilsenza dover accedere a developer.apple.com.

A partire dal 06/10/2015, il collegamento agli ultimi strumenti della riga di comando dmgè:

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


Sebbene questo collegamento possa rispondere alla domanda, è meglio includere qui le parti essenziali della risposta e fornire il collegamento come riferimento. Le risposte di solo collegamento possono diventare non valide se la pagina collegata cambia.
GRG

1
@grgarside: ci è voluto un po 'di tempo per aggiornare questo script con l'ultimo Yosemite / XCode 6.3.2 CLT dmge ho copiato le parti essenziali della risposta localmente su questa risposta.
TrinitronX,

@grgarside: ho capito il problema del collegamento e che lo script era probabilmente obsoleto, ma non ho avuto il tempo di aggiornarlo lo stesso giorno in cui ho postato inizialmente. Volevo solo dare quei collegamenti come un buon punto di partenza e come nota per tornare indietro, aggiornare e testare di nuovo le cose.
TrinitronX,

1

Ho scoperto che se si installa Home Brew, installerà automaticamente gli strumenti della riga di comando.

Ho provato questo usando questa immagine vagabonda .

Eseguire il comando seguente per installare Homebrew e, in tal modo, installare gli strumenti da riga di comando.

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
  • So che la domanda originale mi ha solo chiesto come installare gli strumenti da riga di comando, ma al giorno d'oggi non conosco alcun mac che non abbia anche Home Brew installato su di esso.

Se guardi github.com/Homebrew/install/blob/… vedrai che Homewbrew sta usando una tecnica simile a quella descritta nelle risposte (ad esempio apple.stackexchange.com/a/195963/66169 ) a questa domanda
Anon
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.