Làm cách nào tôi có thể cài đặt hoàn toàn Công cụ dòng lệnh từ dòng lệnh?


44

Tôi muốn kịch bản cài đặt Công cụ dòng lệnh Xcode.

Trên Mavericks,

xcode-select --install

sẽ mở hộp thoại nhắc người dùng cài đặt, nhưng tôi muốn kích hoạt cài đặt mà không cần hộp thoại, như sử dụng softwareupdatelệnh.

Có cách nào để làm việc này không?

Chỉnh sửa:

Cụ thể, xcode-select --installkhởi chạy một ứng dụng tải xuống và cài đặt các công cụ mà không yêu cầu người dùng tải xuống thủ công hoặc có tài khoản Nhà phát triển của Apple. Nó xuất hiện để sử dụng /System/Library/CoreServices/Install Command Line Developer Tools.appđể làm điều này.

Tôi muốn sử dụng cùng một cơ chế như Apple, nhưng không có GUI. Tôi không muốn phải tải xuống thủ công .dmg chứa các công cụ vì điều này có vẻ dễ vỡ. Apple cung cấp một số công cụ dòng lệnh khác, như softwareupdateinstalltải xuống hoặc cài đặt phần mềm trực tiếp từ Apple và tôi đang tìm kiếm điều tương tự cho loại phân phối này.


1
Bạn đang cố gắng làm điều này cho một kịch bản nội bộ hoặc cho một số loại phân phối? Lý do tôi hỏi là vì các công cụ dành cho nhà phát triển yêu cầu tài khoản nhà phát triển (miễn phí) truy cập và phân phối chúng bên ngoài điều đó sẽ vi phạm thỏa thuận cấp phép của Apple.
Colin C.

1
@ColinC. xcode-select --install không yêu cầu tài khoản Apple Developer. Nó có thể yêu cầu chấp nhận thỏa thuận cấp phép trước khi các công cụ được sử dụng, nhưng nó tải xuống mà không cần tài khoản.
cũng

Câu trả lời:


30

Ước gì tôi có thể yêu cầu tín dụng cho khoản này, nhưng tôi thấy nó bị chôn vùi trong https://github.com/chcokr/osx-init/blob/master/install.sh

Điều này hoạt động trên máy ảo không đầu 10.10 của tôi mà không cần UI đăng nhập. Các bản cập nhật được áp dụng để tương thích với ít nhất 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

Điều này giả sử bạn chỉ có 1 kết quả softwareupdate -l | grep "\*.*Command Line"- nếu điều này trả về nhiều phiên bản, bạn có thể cần logic cụ thể hơn. (Tôi không có trường hợp repro)

một biến thể dường như hoạt động (thử nghiệm giới hạn) vào ngày 10.10-10,14 (10.9 không trả về số phiên bản osx trong tên công cụ cli..như điều này không hoạt động ở đó):

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

một vài ví dụ kết quả:

* 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
Tập lệnh này dường như là nguồn ban đầu của mã và có mã bổ sung sẽ hoạt động trên các phiên bản Mac OS X dưới 10.9: github.com/timsutton/osx-vm-temsheet/blob/iêu
vây

1
thật đáng buồn, nó khá điển hình cho loại công cụ này bị phá vỡ mỗi lần phát hành mới, vì vậy không có gì ngạc nhiên thực sự .....
quan tâm đến

3
Cho ngày 10.12 (Sierra), tất cả những gì tôi phải thay đổi ở đây là để "-v" trở thành "--verbose"
macetw

3
Câu trả lời tuyệt vời, làm việc cho tôi trên Sierra! :-) Tuy nhiên, bạn có thể muốn rm /tmp/.com.apple.dt.CommandLineTools.installondemand.in-progresssau khi chạy softwareupdate -i ... , nếu không các cuộc gọi tiếp theo sẽ softwareupdate -lhiển thị Command Line Tools ... dưới dạng bản cập nhật khả dụng. Bản cập nhật (được cho là) ​​này dường như không được hiển thị trong App Store, có thể vì softwareupdate -lchỉ liệt kê các bản cập nhật "hệ thống", không phải bản cập nhật ứng dụng.
ssc

1
@thaimin Tôi không có bất kỳ trường hợp repro nào trả về nhiều kết quả - nhưng tôi đã đăng một bản cập nhật với một bản sửa lỗi có thể cho bạn. một trong những thách thức là táo mà đã rất không phù hợp với cách họ đặt tên cho những trong những năm qua, do đó, thực sự không có gì siêu phù hợp để sắp xếp hoặc lọc trên ...
Keen

18
  1. Tải xuống gói Công cụ dòng lệnh từ trang web Nhà phát triển của Apple .

  2. Gắn 1 DMG đã tải xuống :

    hdiutil attach "command_line_tools_os_x_mountain_lion_for_xcode__october_2013.dmg"
  3. Chạy trình cài đặt thông qua dòng lệnh:

    cd "/Volumes/Command Line Tools (Mountain Lion)"
    installer -verbose -pkg "Command Line Tools (Mountain Lion).mkpg" -target /
    
  4. Khi hoàn tất, ngắt kết nối DMG và xóa phần tải xuống.

    1. Đẩy DMG 2 .

      cd /
      hdiutil detach /dev/disk3s2
      
    2. Xóa DMG.

      rm "command_line_tools_os_x_mountain_lion_for_xcode__october_2013.dmg"

1 Tại thời điểm viết, DMG và tên gói được tải xuống là chính xác, tuy nhiên trong tương lai, tên có thể thay đổi. Nhớ thay đổi lệnh (hoặc sử dụng hoàn thành tab) để điền vào phần có liên quan của lệnh.
2 Nếu lệnh không hoạt động, hãy kiểm tra đĩa khớp với tên của giá treo (theo mount).


1
Tôi muốn đây là bằng chứng trong tương lai và tôi không muốn phải cung cấp bản sao hình ảnh đĩa công cụ của riêng mình. xcode-select - cài đặt tải xuống và cài đặt các công cụ cho người dùng và không yêu cầu ADC. Tôi muốn làm chính xác điều này, nhưng không có GUI.
cũng

Tìm thấy điểm 1 và 2 rất hữu ích để cài đặt Công cụ IO Phần cứng.
kho

6

Một cách khác là sử dụng applescript này tôi đã viết:

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 Tôi gặp lỗi "osascript không được phép truy cập trợ giúp"
ClintM

6

Một nỗ lực để làm sạch phong cách và logic của câu trả lời được chấp nhận, làm cho nó độc lập với phiên bản nhất có thể, sử dụng softwareupdatehết khả năng của nó và giới thiệu một osbiến có thể sử dụng lại :

#!/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

chỉ là một lưu ý: bộ lọc sw_vers không hoạt động trên các bản phát hành khác nhau trước ngày 10.10. (Tôi không thể nói chuyện với 10.11-10.13, chỉ được thử nghiệm hôm nay vào ngày 10.9 10.10 và 10.14) (xem câu trả lời cập nhật của tôi để biết một số ví dụ)
quan tâm

2

Đây là những gì tôi sử dụng, một phần dựa trên câu trả lời của 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

cập nhật: Apple tiếp tục thêm các cột mới vào cơ sở dữ liệu truy cập, bạn chỉ cần chỉ định các giá trị cho 5 đầu tiên, cập nhật mã để phản ánh điều này.


1

Một vài lựa chọn thay thế có thể được tìm thấy tại các câu trả lời sau:

Tải xuống công cụ dòng lệnh XCode

Bạn có thể tải xuống các gói CLTools XCode 4.x từ trang tải xuống chính thức của họ thông qua các liên kết trực tiếp.

Đây là một kịch bản sẽ tự động hóa quá trình cài đặt cho bạn 1 .

Để tìm các liên kết cập nhật cho các công cụ, bạn có thể sử dụng lệnh này:

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] Xin đừng lạm dụng / quá tải máy chủ của họ

Bạn có thể thấy rằng việc đăng nhập vào Trang web tải xuống dành cho nhà phát triển của Apple sẽ dễ dàng hơn và tải xuống Công cụ dòng lệnh mới nhất có sẵn ở đó. Sau đó, bạn có thể lưu trữ .dmgtrên máy chủ repo gói của riêng mình và có thể cài đặt đáng tin cậy .dmgtrên nhiều máy hdiutilmà không cần phải đăng nhập vào developer.apple.com.

Kể từ ngày 06/10/2015, liên kết đến Công cụ dòng lệnh mới nhất dmglà:

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


Mặc dù liên kết này có thể trả lời câu hỏi, tốt hơn là bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo. Câu trả lời chỉ liên kết có thể trở nên không hợp lệ nếu trang được liên kết thay đổi.
grg

1
@grgarside: Mất một thời gian để cập nhật tập lệnh này với Yosemite / XCode 6.3.2 CLT mới nhất dmgvà sao chép các phần thiết yếu của câu trả lời cục bộ vào câu trả lời này.
TrinitronX

@grgarside: Tôi nhận ra vấn đề liên kết & rằng kịch bản có thể đã lỗi thời, nhưng không có thời gian để cập nhật nó vào cùng ngày tôi đăng đầu tiên. Tôi chỉ muốn cung cấp cho các liên kết đó như là một nơi tốt để bắt đầu và như một lưu ý để tự quay lại và cập nhật & kiểm tra lại mọi thứ.
TrinitronX

1

Tôi thấy rằng nếu bạn cài đặt Home Brew, nó sẽ tự động cài đặt các công cụ dòng lệnh.

Tôi đã thử nghiệm điều này bằng cách sử dụng hình ảnh mơ hồ này .

Chạy lệnh sau để cài đặt Homebrew và thực hiện cài đặt Công cụ dòng lệnh.

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
  • Tôi biết câu hỏi ban đầu chỉ hỏi cách cài đặt Công cụ dòng lệnh, nhưng tôi không biết bất kỳ máy Mac nào ngày nay không cài đặt Home Brew trên đó.

Nếu bạn xem github.com/Homebrew/install/blob/, bạn sẽ thấy Homewbrew đang sử dụng một techinque tương tự như được mô tả trong các câu trả lời (ví dụ: apple.stackexchange.com/a/195963/66169 ) cho câu hỏi này
Anon
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.