¿Cómo puedo instalar las herramientas de línea de comandos completamente desde la línea de comandos?


44

Me gustaría escribir la instalación de las herramientas de la línea de comandos de Xcode.

En Mavericks,

xcode-select --install

abrirá un cuadro de diálogo que le pedirá al usuario que instale, pero me gustaría activar la instalación sin el cuadro de diálogo, como usar el softwareupdatecomando.

¿Hay alguna forma de hacer esto?

Editar:

Específicamente, xcode-select --installlanza una aplicación que descarga e instala las herramientas sin requerir que el usuario las descargue manualmente o tenga una cuenta de desarrollador de Apple. Parece que sirve /System/Library/CoreServices/Install Command Line Developer Tools.apppara hacer esto.

Me gustaría usar el mismo mecanismo que Apple, pero sin la GUI. No quiero tener que descargar manualmente el .dmg que contiene las herramientas ya que esto parece frágil. Apple ofrece varias otras herramientas de línea de comandos, como softwareupdatey installque descargan o instalan software directamente desde Apple, y estoy buscando encontrar lo mismo para este tipo de distribución.


1
¿Estás tratando de hacer esto para un script interno o para algún tipo de distribución? La razón por la que pregunto es porque las herramientas de desarrollador requieren una cuenta de desarrollador (gratuita) para acceder y distribuirlas fuera de eso violaría el acuerdo de licencia de Apple.
Colin C.

1
@ColinC. xcode-select: la instalación no requiere una cuenta de desarrollador de Apple. Puede requerir la aceptación del acuerdo de licencia antes de usar las herramientas, pero las descarga sin una cuenta.
también el

Respuestas:


30

Ojalá pudiera reclamar crédito para este, pero lo encontré enterrado en https://github.com/chcokr/osx-init/blob/master/install.sh

Esto funcionó en mi máquina virtual sin cabeza 10.10 sin una IU iniciada. Actualizaciones aplicadas para compatibilidad con al menos 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

Esto supone que solo tiene 1 resultado softwareupdate -l | grep "\*.*Command Line": si esto devuelve varias versiones, es posible que necesite una lógica más específica. (No tengo un caso de repro)

una variación que parece funcionar (pruebas limitadas) en 10.10-10.14 (10.9 no devuelve un número de versión de osx en el nombre de las herramientas cli ... así que esto no funciona allí):

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

Algunos resultados de ejemplo:

* 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
Este script parece ser la fuente original del código y tiene un código adicional que funcionará en las versiones de Mac OS X inferiores a 10.9: github.com/timsutton/osx-vm-templates/blob/…
finn el

1
lamentablemente es bastante típico para este tipo de cosas no estar funcionando cada nueva versión, por lo que ninguna sorpresa .....
Keen

3
Para 10.12 (Sierra), todo lo que tuve que cambiar aquí fue que "-v" se convirtiera en "--verbose"
macetw

3
Gran respuesta, ¡funciona para mí en Sierra! :-) Sin embargo, es posible que desee rm /tmp/.com.apple.dt.CommandLineTools.installondemand.in-progressdespués de la ejecución softwareupdate -i ... , de lo contrario, las llamadas posteriores se softwareupdate -lmostrarán Command Line Tools ... como una actualización disponible. Esta (supuesta) actualización no parece mostrarse en la App Store, posiblemente porque softwareupdate -lsolo enumera las actualizaciones del "sistema", no las actualizaciones de la aplicación.
ssc

1
@thaimin No tengo ningún caso de repro que devuelva múltiples resultados, pero publiqué una actualización con una posible solución para usted. uno de los retos es que Apple ha sido muy inconsistente con la forma en que éstos nombrar lo largo de los años, así que no hay realmente nada muy consistente para ordenar o filtro en ...
Keen

18
  1. Descargar el paquete de herramientas de línea de comandos desde el sitio para desarrolladores de Apple .

  2. Montar el 1 DMG descargado :

    hdiutil attach "command_line_tools_os_x_mountain_lion_for_xcode__october_2013.dmg"
  3. Ejecute el instalador a través de la línea de comando:

    cd "/Volumes/Command Line Tools (Mountain Lion)"
    installer -verbose -pkg "Command Line Tools (Mountain Lion).mkpg" -target /
  4. Cuando termine, desmonte el DMG y elimine la descarga.

    1. Expulsar el DMG 2 .

      cd /
      hdiutil detach /dev/disk3s2
    2. Eliminar el DMG.

      rm "command_line_tools_os_x_mountain_lion_for_xcode__october_2013.dmg"

1 Al momento de escribir, el DMG descargado y el nombre del paquete son correctos, sin embargo, en el futuro, el nombre puede cambiar. Recuerde alterar el comando (o usar tabulación completada) para completar la parte relevante del comando.
2 Si el comando no funciona, verifique que el disco coincida con el nombre del montaje (según mount).


1
Me gustaría que esto sea una prueba futura, y no quiero tener que proporcionar mi propia copia de la imagen del disco de herramientas. xcode-select: instala descargas e instala las herramientas para el usuario, y no requiere un ADC. Quiero hacer exactamente esto, pero sin la GUI.
también el

Encontramos los puntos 1 y 2 muy útiles para instalar Hardware IO Tools.
rstackhouse

6

Una alternativa es usar este applecript que escribí:

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 Me sale el error "osascript no está permitido en el acceso de asistencia"
ClintM

6

Un intento de limpiar el estilo y la lógica de la respuesta aceptada, haciéndolo lo más independiente posible de la versión, utilizando softwareupdatesu capacidad total e introduciendo una osvariable reutilizable :

#!/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: el filtro sw_vers no funciona en varias versiones anteriores a 10.10. (No puedo hablar con 10.11-10.13, solo probé hoy en 10.9 10.10 y 10.14) (vea mi respuesta actualizada para algunos ejemplos)
interesado el

2

Esto es lo que uso, en parte basado en la respuesta 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

actualización: Apple sigue agregando nuevas columnas a la base de datos de acceso, solo necesita especificar valores para los primeros 5, actualizó el código para reflejar esto.


1

Se pueden encontrar un par de alternativas más en estas respuestas:

Descargar XCode Command Line Tools

Puede descargar los paquetes XCode 4.x CLTools desde su sitio oficial de descargas a través de enlaces directos.

Aquí hay un script que automatizará el proceso de instalación para usted 1 .

Para encontrar enlaces actualizados para las herramientas, puede usar este 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] Por favor no abuses / sobrecargues sus servidores

Es posible que sea más fácil iniciar sesión primero en el sitio de descarga de desarrolladores de Apple y descargar las últimas herramientas de línea de comandos disponibles allí. A continuación, puede alojar el .dmgservidor de repositorio de su propio paquete y poder instalarlo de manera confiable .dmgen muchas máquinas hdiutilsin tener que iniciar sesión en developer.apple.com.

A partir del 10/06/2015, el enlace a las últimas herramientas de línea de comandos dmges:

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


Si bien este enlace puede responder la pregunta, es mejor incluir aquí las partes esenciales de la respuesta y proporcionar el enlace como referencia. Las respuestas de solo enlace pueden volverse inválidas si la página vinculada cambia.
grg

1
@grgarside: Tomó un tiempo actualizar este script con el último CLT Yosemite / XCode 6.3.2 dmg, y copió partes esenciales de la respuesta localmente a esta respuesta.
TrinitronX

@grgarside: me di cuenta del problema de vinculación y que el script probablemente estaba desactualizado, pero no tuve tiempo de actualizarlo el mismo día que publiqué inicialmente. Solo quería dar esos enlaces como un buen lugar para comenzar y como una nota para mí mismo para volver y actualizar y probar cosas nuevamente.
TrinitronX

1

Descubrí que si instala Home Brew, instalará automáticamente las herramientas de línea de comandos.

Probé esto usando esta imagen vagabunda .

Ejecute el siguiente comando para instalar Homebrew y, al hacerlo, instale las Herramientas de línea de comandos.

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
  • Sé que la pregunta original solo preguntaba cómo instalar las herramientas de línea de comandos, pero no conozco ninguna Mac en estos días que no tenga instalado también Home Brew.

Si observa github.com/Homebrew/install/blob/… verá que Homewbrew está utilizando una técnica similar a la descrita en las respuestas (por ejemplo apple.stackexchange.com/a/195963/66169 ) a esta pregunta
Anon
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.