如何完全从命令行安装命令行工具?


44

我想编写Xcode命令行工具的安装脚本。

在小牛上

xcode-select --install

将打开一个对话框,提示用户进行安装,但是我想在没有对话框的情况下触发安装,例如使用softwareupdate命令。

有没有办法做到这一点?

编辑:

具体而言,xcode-select --install启动一个应用程序,该应用程序下载并安装工具,而无需用户手动下载工具或拥有Apple Developer帐户。它似乎可以/System/Library/CoreServices/Install Command Line Developer Tools.app用来做到这一点。

我想使用与Apple相同的机制,但不使用GUI。我不想手动下载包含工具的.dmg,因为这似乎很脆弱。苹果提供了其他几种命令行工具,例如softwareupdateinstall直接从Apple下载或安装软件的,我正在寻找这种发行版本的工具。


1
您是否要为内部脚本或某种发行版本执行此操作?我问的原因是因为开发人员工具需要一个(免费)开发人员帐户来访问和分发它们,否则将违反Apple的许可协议。
Colin C.

1
@ColinC。xcode-select --install不需要Apple Developer帐户。在使用这些工具之前,可能需要接受许可协议,但是该工具无需帐户即可下载。
也是

Answers:


30

希望我可以为此功亏一credit,但我发现它被埋在https://github.com/chcokr/osx-init/blob/master/install.sh中

这可以在没有登录UI的10.10无头VM上运行。已申请至少与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

假设您只有1个结果 softwareupdate -l | grep "\*.*Command Line"-如果返回多个版本,则可能需要更具体的逻辑。(我没有生殖器病例)

在10.10-10.14上似乎可以正常工作的一种变体(有限的测试)(10.9在cli工具名称中未返回osx版本号。因此在此无效):

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

一些示例结果:

* 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
这个脚本似乎是代码的原始来源,有额外的代码,将在Mac OS X版本的工作如下10.9:github.com/timsutton/osx-vm-templates/blob/...
芬兰人

1
可悲的是这是非常典型的这种类型的东西被打破每一个新版本,所以没有真正的惊喜......
敏锐

3
对于10.12(Sierra),我在这里
要做的

3
很好的答案,对我来说对Sierra有用!:-)但是,您可能希望rm /tmp/.com.apple.dt.CommandLineTools.installondemand.in-progress在运行后softwareupdate -i ... ,否则将后续调用softwareupdate -l显示Command Line Tools ... 为可用更新。此(假定)更新似乎未在App Store中显示,可能是因为softwareupdate -l仅列出了“系统”更新,而不是应用程序更新。
ssc

1
@thaimin我没有任何返回多个结果的repro案例-但我发布了一个可能为您修复的更新。挑战之一是苹果多年来一直与它们的命名方式不一致,因此在排序或过滤方面确实没有任何超级一致...
keen

18
  1. Apple Developer网站下载命令行工具包。

  2. 挂载下载的1 DMG:

    hdiutil attach "command_line_tools_os_x_mountain_lion_for_xcode__october_2013.dmg"
  3. 通过命令行运行安装程序:

    cd "/Volumes/Command Line Tools (Mountain Lion)"
    installer -verbose -pkg "Command Line Tools (Mountain Lion).mkpg" -target /
  4. 完成后,卸载DMG并删除下载。

    1. 弹出DMG 2

      cd /
      hdiutil detach /dev/disk3s2
    2. 删除DMG。

      rm "command_line_tools_os_x_mountain_lion_for_xcode__october_2013.dmg"

1在撰写本文时,下载的DMG和软件包名称是准确的,但是将来,名称可能会更改。切记更改命令(或使用制表符补全)以填写命令的相关部分。
2如果该命令不起作用,请检查磁盘是否与安装的名称匹配(按照mount)。


1
我希望这可以作为将来的证明,并且我不想提供自己的工具磁盘映像副本。xcode-select --install为用户下载并安装工具,并且不需要ADC。我想做到这一点,但没有GUI。
也是

发现要点1和2对安装硬件IO工具非常有用。
rstackhouse

6

一种替代方法是使用我编写的此applescript:

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我收到错误消息“辅助访问不允许使用
osascript

6

尝试清理已接受答案的样式和逻辑,使其尽可能独立于版本,并利用softwareupdate其全部功能并引入可重用的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

请注意:sw_vers过滤器不适用于10.10之前的各种发行版。(我无法与10.11-10.13通话,仅在今天的10.9、10.10和10.14上进行了测试)(请参阅我的更新答案以获取一些示例)
敏锐的

2

这就是我使用的,部分基于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

更新:Apple一直在向访问数据库添加新列,您只需要为前5个指定值,更新代码即可反映这一点。


1

可以在以下答案中找到更多其他选择:

下载XCode命令行工具

您可以通过直接链接从其官方下载站点下载XCode 4.x CLTools软件包。

这是一个脚本,它将自动为您安装过程1

要查找工具的更新链接,可以使用以下命令:

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]请不要滥用/超载他们的服务器

您可能会发现,首先登录Apple Developer下载站点并下载那里可用的最新命令行工具会更容易。然后,您可以.dmg在自己的软件包存储库服务器上托管,并能够.dmg在许多计算机上可靠地安装它们,hdiutil而不必登录到developer.apple.com。

截至2015年6月10日,指向最新命令行工具的链接dmg为:

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


尽管此链接可以回答问题,但最好在此处包括答案的基本部分,并提供链接以供参考。如果链接的页面发生更改,仅链接的答案可能会失效。
grg

1
@grgarside:花了一些时间使用最新的Yosemite / XCode 6.3.2 CLT 更新此脚本dmg,并将答案的重要部分本地复制到此答案。
TrinitronX

@grgarside:我意识到链接问题,该脚本可能已过期,但在我最初发布的同一天没有时间对其进行更新。我只是想给那些链接一个开始的好地方,并作为自我回溯的笔记,以便再次进行更新和测试。
TrinitronX

1

我发现,如果您安装Home Brew,它将自动安装命令行工具。

我使用这个无聊的图像对此进行了测试。

运行以下命令以安装Homebrew,并安装命令行工具。

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
  • 我知道最初的问题仅询问如何安装命令行工具,但这些天我不知道还没有安装Home Brew的任何Mac。

如果你看一下github.com/Homebrew/install/blob/...你会看到Homewbrew使用类似techinque到的是,在答案中描述(例如apple.stackexchange.com/a/195963/66169)这个问题
匿名
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.