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

Me gustaría programar la instalación de las herramientas de 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 se usa /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 parece frágil. Apple proporciona 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.

¿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.
@ColinC. xcode-select --install 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.

Respuestas (8)

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

Esto funcionó en mi VM sin cabeza 10.10 sin una interfaz de usuario registrada. 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 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 ejemplos de resultados:

* 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
Hay un paso adicional para solicitar la contraseña de sudo. ¿Cómo quitar eso?
Para Catalina, el comando debe modificarse ligeramente softwareupdate -l | grep "*.*Línea de comandos" | cola -n 1 | awk -F"*" '{imprimir $2}' | sed -e 's/^ *//' | sed 's/Etiqueta: //g' | tr -d '\n'
@jinbeomhong, podría aplicar el bit setuid en el script (chmod u+s <scriptname>), y luego no tendría que ingresar la contraseña de sudo. Esto puede ser un riesgo de seguridad si alguien más tiene acceso a su computadora, así que tenga cuidado.
  1. Descargue el paquete de herramientas de línea de comandos del sitio para desarrolladores de Apple .

  2. Monte 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 modificar el comando (o usar el tabulador) 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).

Me gustaría que esto sea una prueba para el futuro, y no quiero tener que proporcionar mi propia copia de la imagen del disco de herramientas. xcode-select --install descarga e instala las herramientas para el usuario y no requiere un ADC. Quiero hacer exactamente esto, pero sin la GUI.
Encontré los puntos 1 y 2 muy útiles para instalar Hardware IO Tools.

Un intento de limpiar el estilo y la lógica de la respuesta aceptada, haciéndola lo más independiente posible de la versión, utilizando toda su capacidad e introduciendo una variable softwareupdatereutilizable :os

#!/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 la 10.10. (No puedo hablar con 10.11-10.13, solo probado hoy en 10.9 10.10 y 10.14) (vea mi respuesta actualizada para ver algunos ejemplos)
Esto supone que la versión de las herramientas de línea de comandos de XCode es la misma que la versión de macOS y, al menos en mi sistema (macOS 12.4, herramientas de cliente de XCode 13.4), ese no es el caso.

Una alternativa es usar este applescript 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
macos 10.11 aparece el error "No se permite osascript en el acceso de asistencia"

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 Command Line Tools, pero no conozco ninguna Mac en estos días que no tenga instalado Home Brew.
Si mira github.com/Homebrew/install/blob/… verá que Homewbrew está usando una técnica similar a la descrita en las respuestas (por ejemplo , apple.stackexchange.com/a/195963/66169 ) a esta pregunta

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.

EDITAR (2021-2022): los servidores de Apple ahora responden con una 302redirección ahttps://developer.apple.com/unauthorized/

Post-apocalíptico ... er... solución post-2021

Este breve extracto de mi bootstrap.shscript de macOS se probó en diciembre de 2021.

# Try the AppleScript automation method rather than relying on manual .xip / .dmg download & mirroring
# Note: Apple broke automated Xcode installer downloads.  Now requires manual Apple ID sign-in.
# Source: https://web.archive.org/web/20211210020829/https://techviewleo.com/install-xcode-command-line-tools-macos/
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

Soluciones antiguas (anteriores a 2021)

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

Descargue las herramientas de línea de comandos de XCode

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

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

EDITAR (2021-2022): los servidores de Apple ahora responden con un 302Redireccionamiento a https://developer.apple.com/unauthorized/cuando se intenta descargar los paquetes CLT. En base a esto, Apple interrumpió todas las descargas directas desatendidas sin iniciar sesión primero con una ID de Apple. La cantidad de aros que necesitaría pasar un script para iniciar sesión, almacenar cookies y descargar es prohibitiva.

Para encontrar enlaces actualizados para las herramientas, puede usar este comando:

curl -Lks https://devimages.apple.com.edgekey.net/downloads/xcode/simulators/index-3905972D-B609-49CE-8D06-51ADC78E07BC.dvtdownloadableindex | plutil -convert json -o - - | python -mjson.tool | less

EDITAR (2021-2022): Esta URL ahora parece tener certificados SSL rotos, y la última versión disponible es Xcode.CLTools.10.8 version 2014.4( command_line_tools_for_osx_mountain_lion_april_2014.dmg)...

Nota: El curlcomando anterior ahora tiene el -kindicador agregado para solucionar este problema de validación de certificados. Tenga en cuenta que el -k / --insecureindicador de opción de la línea de comandos omitirá las comprobaciones de seguridad del certificado SSL. Esto es inseguro y no hay forma de verificar mediante una cadena de confianza PKI + CA que este dominio es confiable y que aún es propiedad de Apple. Se recomienda utilizar la alternativa xcode-select --install+ osascriptsolución anterior.

[1] Por favor, no abuse/sobrecargue sus servidores

Es posible que le resulte más fácil iniciar sesión primero en el sitio de descargas para desarrolladores de Apple y descargar las últimas herramientas de línea de comandos disponibles allí. Luego puede alojar el .dmgpaquete en su propio servidor de repositorio 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 herramientas de línea de comandos más recientes dmges:

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

EDITAR (2021-2022): esta URL ya no funciona... Los servidores de Apple ahora responden con un 302Redireccionamiento a https://developer.apple.com/unauthorized/si no ha iniciado sesión con una ID de Apple.

Consulte la alternativa xcode-select --install+ osascriptsolución anterior.

Si bien este enlace puede responder la pregunta, es mejor incluir las partes esenciales de la respuesta aquí y proporcionar el enlace como referencia. Las respuestas de solo enlace pueden dejar de ser válidas si la página enlazada cambia.
@grgarside: se tomó un tiempo para actualizar este script con el último Yosemite/XCode 6.3.2 CLT dmgy copió partes esenciales de la respuesta localmente a esta respuesta.
@grgarside: me di cuenta del problema de vinculación y que el guión probablemente estaba desactualizado, pero no tuve tiempo de actualizarlo el mismo día que lo publiqué inicialmente. Solo quería dar esos enlaces como un buen lugar para comenzar y como una nota personal para regresar y actualizar y probar las cosas nuevamente.

Tuve que modificar ligeramente el código para Monterey 12.0.1.

#!/bin/bash
echo "Checking Xcode CLI tools"
# Only run if the tools are not installed yet
# To check that try to print the SDK path
xcode-select -p &> /dev/null
if [ $? -ne 0 ]; then
  echo "Xcode CLI tools not found. Installing them..."
  touch /tmp/.com.apple.dt.CommandLineTools.installondemand.in-progress;
  PROD=$(softwareupdate -l |
    grep "\*.*Command Line" |
    tail -n 1 | sed 's/^[^C]* //')
  softwareupdate -i "$PROD" --verbose;
else
  echo "Xcode CLI tools OK"
fi
Esto no proporciona una respuesta a la pregunta. Una vez que tenga suficiente reputación , podrá comentar cualquier publicación ; en su lugar, proporcione respuestas que no requieran aclaración por parte del autor de la pregunta . - De la revisión