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 softwareupdate
comando.
¿Hay alguna forma de hacer esto?
Editar:
Específicamente, xcode-select --install
lanza 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.app
para 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 softwareupdate
y install
que descargan o instalan software directamente desde Apple, y estoy buscando encontrar lo mismo para este tipo de distribución.
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
Descargue el paquete de herramientas de línea de comandos del sitio para desarrolladores de Apple .
Monte el 1 DMG descargado:
hdiutil attach "command_line_tools_os_x_mountain_lion_for_xcode__october_2013.dmg"
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 /
Cuando termine, desmonte el DMG y elimine la descarga.
Expulsar el DMG 2 .
cd /
hdiutil detach /dev/disk3s2
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
).
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 softwareupdate
reutilizable :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
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
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)"
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 302
redirección ahttps://developer.apple.com/unauthorized/
Este breve extracto de mi bootstrap.sh
script 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
Se pueden encontrar un par de alternativas más en estas respuestas:
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 302
Redireccionamiento 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 curl
comando anterior ahora tiene el -k
indicador agregado para solucionar este problema de validación de certificados. Tenga en cuenta que el -k / --insecure
indicador 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
+ osascript
solució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 .dmg
paquete en su propio servidor de repositorio y poder instalarlo de manera confiable .dmg
en muchas máquinas hdiutil
sin 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 dmg
es:
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 302
Redireccionamiento a https://developer.apple.com/unauthorized/
si no ha iniciado sesión con una ID de Apple.
Consulte la alternativa xcode-select --install
+ osascript
solución anterior.
dmg
y copió partes esenciales de la respuesta localmente a esta respuesta.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
colin c
además