代码改变世界

Xcode安装多个版本并自动切换版本

2020-03-11 17:22  加个小鸡腿  阅读(9645)  评论(3编辑  收藏  举报

因为业务需要,我们有时候需要安装多个xcode版本,新的版本,老的版本。新的版本我们以xcode11为例子,老的版本,我们以xcode10为例子,

下载老版本到: 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构建,我们基本都是要求自动化,最好直接调用脚本就可以切换,

上面这些步骤中需要输入密码的是:sudo xcode-select -s /Applications/Xcode10/Xcode.app/Contents/Developer  必须以root权限执行。那么怎么自动切换与检测版本呢?

 可以使用expect来实现自动输入密码

即在切换xcode版本之前,执行export DEVELOPER_DIR切换环境变量,函数如下:

change_xcode_version()
{
    [ "$1" != "11" -a "$1" != "13" ] && echo "input is $1,not 11 or 13" && exit 1
    xcode_v=$1
    echo "xcode version:"
    xcodebuild -version
    [ "$1" == "11" ] && export DEVELOPER_DIR=/Applications/Xcode11/Xcode.app/Contents/Developer
    [ "$1" == "13" ] && export DEVELOPER_DIR=/Applications/Xcode.app/Contents/Developer
    ./expect_xcode $1 #该脚本用于切换xcode版本,执行后可以使用gcc --version验证DEVELOPER_DIR是否是对应xcode版本的路径
    sleep 10
    xcodebuild -version
    #检查是否切换成功,否则异常退出
    xcode_ver=`xcodebuild -version |grep Xcode |awk -F " " '{print $2}'`
    [ "$1" == "11" ] && [ "$xcode_ver" != "11.4" ] && echo "xcode version $xcode_ver, not 11.4" && exit 1
    [ "$1" == "13" ] && [ "$xcode_ver" != "13.1" ] && echo "xcode version $xcode_ver, not 13.1" && exit 1
    echo "new xcode version:"
    xcodebuild -version
}

其中expect_xcode脚本如下:

#!/usr/bin/expect
set timeout 10
set version [lindex $argv 0]
set password "12341234123" #开机密码

if {$version == "13" } {
    spawn sudo xcode-select -s /Applications/Xcode.app/Contents/Developer
}
if {$version == "11" } {
    spawn sudo xcode-select -s /Applications/Xcode11/Xcode.app/Contents/Developer
}
expect "*assword*" {send "$password\r"}
interact

调用上面的 函数change_xcode_version 11就可以切换到xcode11 , 调用函数change_xcode_version 13就可以切换到xcode13