Como posso instalar as ferramentas de linha de comando completamente a partir da linha de comando?

44

Eu gostaria de criar um script para a instalação das ferramentas de linha de comando do Xcode.

No Mavericks,

xcode-select --install

abrirá uma caixa de diálogo solicitando que o usuário instale, mas eu gostaria de acionar a instalação sem a caixa de diálogo, como usar o softwareupdatecomando

Existe uma maneira de fazer isso?

Editar:

Especificamente, xcode-select --installinicia um aplicativo que baixa e instala as ferramentas sem exigir que o usuário faça o download manualmente ou tenha uma conta de desenvolvedor da Apple. Parece usar /System/Library/CoreServices/Install Command Line Developer Tools.apppara fazer isso.

Eu gostaria de usar o mesmo mecanismo que a Apple, mas sem a GUI. Não quero ter que baixar manualmente o .dmg que contém as ferramentas, pois isso parece frágil. A Apple fornece várias outras ferramentas de linha de comando, como softwareupdatee installque baixam ou instalam software diretamente da Apple, e estou procurando encontrar o mesmo para esse tipo de distribuição.

Além disso
fonte
1
Você está tentando fazer isso para um script interno ou para algum tipo de distribuição? O motivo pelo qual pergunto é porque as ferramentas de desenvolvedor exigem uma conta (gratuita) de desenvolvedor para acessá-las e distribuí-las fora dela, violando o contrato de licença da Apple.
Colin C.
1
@ColinC. O xcode-select --install não requer uma conta de desenvolvedor da Apple. Pode exigir a aceitação do contrato de licença antes que as ferramentas sejam usadas, mas as baixa sem uma conta.
também

Respostas:

30

Gostaria de poder reivindicar crédito por este, mas o encontrei enterrado em https://github.com/chcokr/osx-init/blob/master/install.sh

Isso funcionou na minha VM sem cabeça 10.10 sem uma interface de usuário conectada. Atualizações aplicadas para compatibilidade com pelo 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

Isso pressupõe que você tenha apenas 1 resultado para softwareupdate -l | grep "\*.*Command Line"- se isso retornar várias versões, você poderá precisar de uma lógica mais específica. (Eu não tenho um caso de repro)

uma variação que parece funcionar (teste limitado) em 10.10-10.14 (10.9 não retorna um número de versão osx no nome das ferramentas cli .. então isso não funciona 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')

alguns exemplos 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
afiado
fonte
1
Esse script parece ser a fonte original do código e possui um código adicional que funcionará nas versões do Mac OS X abaixo de 10.9: github.com/timsutton/osx-vm-templates/blob/…
finn
1
infelizmente, é bastante típico para este tipo de material a ser quebrado cada nova versão, então nenhuma surpresa .....
afiado
3
Para 10,12 (Serra), tudo o que eu tinha que mudar aqui foi para "-v" tornar-se "--verbose"
macetw
3
Ótima resposta, funciona para mim na Sierra! :-) No entanto, você pode querer rm /tmp/.com.apple.dt.CommandLineTools.installondemand.in-progressdepois da execução softwareupdate -i ... , caso contrário, as chamadas subsequentes serão softwareupdate -lexibidas Command Line Tools ... como uma atualização disponível. Essa (suposta) atualização não parece ser mostrada na App Store, possivelmente porque softwareupdate -lapenas lista as atualizações do "sistema", não as atualizações do aplicativo.
SSC
1
@thaimin Eu não tenho nenhum caso de reprovação que retorne vários resultados - mas eu publiquei uma atualização com uma possível correção para você. um dos desafios é que a Apple tem sido muito inconsistente com a forma como eles nomear estes ao longo dos anos, então não há realmente nada de super consistente para classificar ou filtro em ...
afiado
18
  1. Faça o download do pacote Command Line Tools no site da Apple Developer .

  2. Monte o 1 DMG baixado :

    hdiutil attach "command_line_tools_os_x_mountain_lion_for_xcode__october_2013.dmg"
  3. Execute o instalador pela linha de comando:

    cd "/Volumes/Command Line Tools (Mountain Lion)"
    installer -verbose -pkg "Command Line Tools (Mountain Lion).mkpg" -target /
    
  4. Quando terminar, desmonte o DMG e exclua o download.

    1. Ejete o DMG 2 .

      cd /
      hdiutil detach /dev/disk3s2
      
    2. Exclua o DMG.

      rm "command_line_tools_os_x_mountain_lion_for_xcode__october_2013.dmg"

1 No momento da redação deste documento, o DMG e o nome do pacote baixados são precisos; no entanto, no futuro, o nome poderá mudar. Lembre-se de alterar o comando (ou use o preenchimento de tabulação) para preencher a parte relevante do comando.
2 Se o comando não funcionar, verifique se o disco corresponde ao nome da montagem (conforme mount).

grg
fonte
1
Gostaria que isso fosse à prova do futuro e não quero fornecer minha própria cópia da imagem do disco das ferramentas. xcode-select --install baixa e instala as ferramentas para o usuário, e não requer um ADC. Eu quero fazer exatamente isso, mas sem a GUI.
também
Os pontos 1 e 2 foram muito úteis para instalar o Hardware IO Tools.
Rtackhouse
6

Uma alternativa é usar este manuscrito que escrevi:

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
fonte
1
MacOS 10.11 eu recebo o erro "osascript não é permitido no acesso assistiva"
ClintM
6

Uma tentativa de limpar o estilo e a lógica da resposta aceita, tornando-a o mais independente da versão possível, usando softwareupdatesua capacidade total e introduzindo uma osvariável reutilizável :

#!/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
fonte
apenas uma observação: o filtro sw_vers não funciona em várias versões anteriores à 10.10. (Não consigo falar com 10.11-10.13, só testei hoje em 10.9 10.10 e 10.14) (veja minha resposta atualizada para alguns exemplos)
entusiasmado em
2

É isso que eu uso, em parte com base na resposta da 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

atualização: a Apple continua adicionando novas colunas ao banco de dados de acesso; você só precisa especificar valores para os 5 primeiros; atualizou o código para refletir isso.

Cyberbeni
fonte
1

Mais algumas alternativas podem ser encontradas nessas respostas:

Baixar ferramentas de linha de comando XCode

Você pode fazer o download dos pacotes XCode 4.x CLTools do site oficial de downloads, através de links diretos.

Aqui está um script que automatizará o processo de instalação para você 1 .

Para encontrar links atualizados para as ferramentas, você pode 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, não abuse / sobrecarregue seus servidores

Você pode achar que é mais fácil primeiro fazer login no site de download do desenvolvedor da Apple e baixar as mais recentes ferramentas de linha de comando disponíveis no site. Em seguida, você pode hospedar o .dmgservidor de repositório de pacotes no seu próprio .dmgcomputador e poder instalá-lo de maneira confiável em muitas máquinas hdiutilsem precisar fazer login no developer.apple.com.

Em 10/06/2015, o link para as ferramentas de linha de comando mais recentes dmgé:

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

TrinitronX
fonte
Embora esse link possa responder à pergunta, é melhor incluir aqui as partes essenciais da resposta e fornecer o link para referência. As respostas somente para links podem se tornar inválidas se a página vinculada for alterada.
grg
1
@grgarside: Demorou algum tempo para atualizar este script com o Yosemite / XCode 6.3.2 CLT mais recente dmge copiou partes essenciais da resposta localmente para esta resposta.
TrinitronX
@grgarside: percebi o problema de vinculação e que o script provavelmente estava desatualizado, mas não tive tempo de atualizá-lo no mesmo dia em que publiquei inicialmente. Eu só queria dar esses links como um bom lugar para começar e como uma nota para voltar e atualizar e testar as coisas novamente.
TrinitronX
1

Descobri que, se você instalar o Home Brew, ele instalará automaticamente as ferramentas de linha de comando.

Eu testei isso usando essa imagem vaga .

Execute o comando a seguir para instalar o Homebrew e, ao fazer isso, instale as Ferramentas de Linha de Comando.

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
  • Eu sei que a pergunta original só perguntou como instalar as ferramentas de linha de comando, mas atualmente não conheço nenhum mac que também não tenha o Home Brew instalado.
Nathan F.
fonte
Se você olhar no github.com/Homebrew/install/blob/… , verá que o Homewbrew está usando uma tecnologia semelhante à descrita nas respostas (por exemplo, apple.stackexchange.com/a/195963/66169 ) a esta pergunta
Anon