Comment puis-je installer les outils de ligne de commande complètement à partir de la ligne de commande?

44

J'aimerais écrire un script pour l'installation des outils de ligne de commande Xcode.

Sur Mavericks,

xcode-select --install

ouvrira une boîte de dialogue invitant l’utilisateur à s’installer, mais j’aimerais déclencher l’installation sans la boîte de dialogue, comme pour utiliser la softwareupdatecommande.

Y a-t-il un moyen de faire cela?

Modifier:

En particulier, xcode-select --installlance une application qui télécharge et installe les outils sans demander à l'utilisateur de les télécharger manuellement ou d'avoir un compte de développeur Apple. Il semble utiliser /System/Library/CoreServices/Install Command Line Developer Tools.apppour faire cela.

J'aimerais utiliser le même mécanisme qu'Apple, mais sans l'interface graphique. Je ne veux pas avoir à télécharger manuellement le fichier .dmg contenant les outils car cela semble fragile. Apple propose plusieurs autres outils de ligne de commande, comme softwareupdateet installque télécharger ou installer le logiciel directement auprès d' Apple, et je suis à la recherche de trouver la même chose pour ce type de distribution.

également
la source
1
Essayez-vous de faire cela pour un script interne ou pour une sorte de distribution? Je pose la question parce que les outils de développement requièrent un compte de développeur (gratuit) pour pouvoir y accéder et les distribuer en dehors de cela enfreindrait le contrat de licence d'Apple.
Colin C.
1
@ColinC. xcode-select --install ne nécessite pas de compte Apple Developer. L’acceptation du contrat de licence peut être nécessaire avant l’utilisation des outils, mais elle est téléchargée sans compte.
également

Réponses:

30

Si je pouvais demander un crédit pour celui-ci, mais je l'ai trouvé enterré dans https://github.com/chcokr/osx-init/blob/master/install.sh

Cela a fonctionné sur ma machine virtuelle sans tête 10.10 sans interface utilisateur connectée. Mises à jour appliquées pour compatibilité avec au moins 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

Cela suppose que vous n’avez qu’un résultat softwareupdate -l | grep "\*.*Command Line": si cela renvoie plusieurs versions, vous aurez peut-être besoin d’une logique plus spécifique. (Je n'ai pas de cas de repro)

une variante qui semble fonctionner (tests limités) le 10.10.10.14 (10.9 ne renvoie pas de numéro de version osx dans le nom de Cli Tools..so cela ne fonctionne pas 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')

quelques exemples de résultats:

* 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
enthousiaste
la source
1
Ce script semble être la source d' origine pour le code et a un code supplémentaire qui fonctionnera sur les versions de Mac OS X ci - dessous 10.9: github.com/timsutton/osx-vm-templates/blob/...
finn
1
Malheureusement, il est assez typique que ce type de matériel soit cassé à chaque nouvelle version, donc pas de vraie surprise .....
vif
3
Pour 10.12 (Sierra), tout ce que je devais changer ici était que "-v" devienne "--verbose"
macetw
3
Excellente réponse, travaille pour moi sur Sierra! :-) Cependant, vous pouvez le vouloir après rm /tmp/.com.apple.dt.CommandLineTools.installondemand.in-progressavoir exécuté softwareupdate -i ... , sinon les appels suivants seront softwareupdate -laffichés en Command Line Tools ... tant que mise à jour disponible. Cette mise à jour (supposée) ne semble pas apparaître dans l'App Store, probablement parce qu'elle softwareupdate -lrépertorie uniquement les mises à jour "système", pas les mises à jour d'applications.
SSC
1
@thaimin Je n'ai pas de cas de repro qui renvoient plusieurs résultats - mais j'ai posté une mise à jour avec un correctif possible pour vous. l' un des défis est que la pomme a été très incompatible avec la façon dont ils nomment ces au fil des années, donc il n'y a vraiment rien de super cohérent pour trier ou filtrer sur ...
vif
18
  1. Téléchargez le package d'outils de ligne de commande à partir du site Apple Developer .

  2. Montez le 1 DMG téléchargé :

    hdiutil attach "command_line_tools_os_x_mountain_lion_for_xcode__october_2013.dmg"
  3. Exécutez le programme d'installation via la ligne de commande:

    cd "/Volumes/Command Line Tools (Mountain Lion)"
    installer -verbose -pkg "Command Line Tools (Mountain Lion).mkpg" -target /
    
  4. Lorsque vous avez terminé, démontez le fichier DMG et supprimez le téléchargement.

    1. Éjectez le DMG 2 .

      cd /
      hdiutil detach /dev/disk3s2
      
    2. Supprimer le DMG.

      rm "command_line_tools_os_x_mountain_lion_for_xcode__october_2013.dmg"

1 Au moment de la rédaction de cet article, le nom de DMG et le package téléchargés sont exacts. Toutefois, à l'avenir, le nom pourrait changer. N'oubliez pas de modifier la commande (ou utilisez la tabulation) pour renseigner la partie pertinente de la commande.
2 Si la commande ne fonctionne pas, vérifiez que le disque correspond au nom du montage (comme indiqué mount).

grg
la source
1
Je voudrais que cela soit une preuve pour le futur, et je ne veux pas avoir à fournir ma propre copie de l'image disque des outils. xcode-select --installe les téléchargements et installe les outils pour l'utilisateur, sans nécessiter un ADC. Je veux faire exactement cela, mais sans l'interface graphique.
également
Vous avez trouvé les points 1 et 2 très utiles pour l’installation des Outils d’IO matériel.
rstackhouse
6

Une alternative est d'utiliser ce script que j'ai écrit:

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
la source
1
macos 10.11 Je reçois le message d'erreur "osascript n'est pas autorisé en accès d'assistance"
ClintM
6

Tentative de nettoyage du style et de la logique de la réponse acceptée, en la rendant aussi indépendante de la version que possible, en utilisant softwareupdateau maximum sa capacité et en introduisant une osvariable réutilisable :

#!/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
la source
juste une remarque: le filtre sw_vers ne fonctionne pas sur différentes versions avant 10.10. (Je ne peux pas parler de 10.11-10.13, seulement testé aujourd'hui sur 10.9, 10.10 et 10.14) (voir ma réponse mise à jour pour quelques exemples)
désireux de
2

C'est ce que j'utilise, basé en partie sur la réponse de 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

update: Apple continue d’ajouter de nouvelles colonnes à la base de données d’accès; il vous suffit de spécifier des valeurs pour les 5 premières et mis à jour le code en conséquence.

Cyberbeni
la source
1

Quelques autres solutions peuvent être trouvées à ces réponses:

Télécharger les outils de ligne de commande XCode

Vous pouvez télécharger les packages CLTools XCode 4.x à partir de leur site de téléchargement officiel via des liens directs.

Voici un script qui automatisera le processus d’installation pour vous 1 .

Pour trouver des liens mis à jour pour les outils, vous pouvez utiliser cette commande:

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] S'il vous plaît ne pas abuser / surcharger leurs serveurs

Vous constaterez peut-être qu'il est plus facile de se connecter d'abord au site de téléchargement pour développeurs Apple et de télécharger les derniers outils de ligne de commande disponibles sur ce site. Vous pouvez ensuite héberger le .dmgsur votre propre serveur de dépôt de package et pouvoir l'installer de manière fiable .dmgsur de nombreuses machines hdiutilsans avoir à vous connecter à developer.apple.com.

À partir du 06/10/2015, le lien vers les derniers outils de ligne de commande dmgest le suivant:

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

TrinitronX
la source
Bien que ce lien puisse répondre à la question, il est préférable d’inclure ici les parties essentielles de la réponse et de fournir le lien pour référence. Les réponses avec lien uniquement peuvent devenir non valides si la page liée est modifiée.
grg
1
@grgarside: Il a fallu du temps pour mettre à jour ce script avec le dernier CLT Yosemite / XCode 6.3.2 dmget copier des parties essentielles de la réponse localement pour cette réponse.
TrinitronX
@grgarside: J'ai réalisé le problème de lien et que le script était probablement obsolète, mais je n'ai pas eu le temps de le mettre à jour le même jour que j'ai posté. Je voulais juste donner à ces liens un bon point de départ et une note personnelle pour revenir en arrière et mettre à jour et tester de nouveau les choses.
TrinitronX
1

J'ai constaté que si vous installez Home Brew, les outils de ligne de commande seront automatiquement installés.

J'ai testé cela en utilisant cette image vagabonde .

Exécutez la commande suivante pour installer Homebrew , puis installez les outils de ligne de commande.

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
  • Je sais que la question initiale ne demandait que comment installer les outils de ligne de commande, mais je ne connais aucun mac de nos jours sur lequel Home Brew n'est pas installé.
Nathan F.
la source
Si vous regardez github.com/Homebrew/install/blob/…, vous verrez que Homewbrew utilise une technologie similaire à celle décrite dans les réponses (par exemple apple.stackexchange.com/a/195963/66169 ) à cette question
Anon