因為業務需要,我們有時候需要安裝多個xcode版本,新的版本,老的版本。新的版本我們以xcode11為例子,老的版本,我們以xcode10為例子,我mac上已經安裝了xcode11了,開發讓在安裝一個xcode10 打包ios sdk。
下載老版本到: https://developer.apple.com/download/more/ 下載xcode10版本。
1.下載以后 我們看到是一個xcode10.xip文件,這是我第一次看到xip后綴的文件,咋裝! 原來雙擊一下就可以了,會解壓出一個xcode.app 的文件夾。
2.在/Applications目錄下新建一個文件夾Xcode10,將剛才第一步中得到的xcode.app移動到/Applications/Xcode10/目錄下。
3.顯示當前使用的xcode : xcode-select -p ,顯示如下:
4.切換版本:sudo xcode-select -s /Applications/Xcode10/Xcode.app/Contents/Developer
5.顯示當前版本:
用幾種方式,如下:
(1)查看生效路徑: gcc --version ,如下(最后那條):
(2)xcode-select -p 如下:
(3)查看xcode版本號: xcodebuild -version
要再切回xcode11 也是一樣的辦法,這樣就可以切來切去了。
但是,還有個問題,jenkins構建,我們基本都是要求自動化,現在就是一個ios scheme需要xcode10的版本,其他還是需要用最新的版本,我總不能每次再構建之前都手動操作上面的過程吧,這樣是不合理的,最好能敲命令就可以,
上面這些步驟中需要輸入密碼的是:sudo xcode-select -s /Applications/Xcode10/Xcode.app/Contents/Developer 必須以root權限執行。那么怎么自動切換與檢測版本呢?
可以使用expect來實現自動輸入密碼。
編輯兩個文件,一個test.sh, 一個expect_xcode,放在相同目錄下。expect_xcode用來切換xcode版本,test.sh 用來檢測是否成功。
test.sh 內容如下:
#!bin/sh echo mac os version: sw_vers echo xcode version: xcodebuild -version xcode_ver=`xcodebuild -version |grep Xcode |awk -F " " '{print $2}'` echo xcode version:$xcode_ver if [ "$xcode_ver" != "10.0" ]; then ./expect_xcode 10 #切換到xcode10 sleep 10 gcc --version xcodebuild -version xcode_ver=`xcodebuild -version |grep Xcode |awk -F " " '{print $2}'` #查看是否切換成功 [ "$xcode_ver" != "10.0" ] && echo xcode version $xcode_version, not 10 && exit 1 fi if [ "$xcode_ver" == "10.0" ]; then echo others not use xcode 10, you need use root to set as follow steps: ./expect_xcode #切換為xcode11 sleep 10 gcc --version xcodebuild -version xcode_ver=`xcodebuild -version |grep Xcode |awk -F " " '{print $2}'`
[ "$xcode_ver" == "10.0" ] && echo xcode version $xcode_version, not newest && exit 1
fi
echo new xcode version:
xcodebuild -version
expect_xcode內容如下:
#!/usr/bin/expect set timeout 10 set version [lindex $argv 0] set password "123456" if {$version == "10" } { #如何輸入是10表示要切換成xcode10 spawn sudo xcode-select -s /Applications/Xcode10/Xcode.app/Contents/Developer } else { spawn sudo xcode-select -s /Applications/Xcode.app/Contents/Developer } expect "*assword*" {send "$password\r"} #發送密碼 interact
這樣,就可以了 但是我發現,執行了expect_xcode不會馬上生效,所以我又再test.sh中sleep了10s