Shell应用场景1 ~ iOS脚本自动化打包详细教程
一、背景
背景1、手头项目中某个组件或者有一堆代码,需要抽出来封装成framework。
背景2、创建实现一个sdk项目,生成动态库、静态库给第三方使用。
二、脚本自动化原因
手动打包的步骤,简单来说分为三步:
1、编辑Scheme的环境为release环境
2、切换到模拟器状态下执行 command+B 编译
3、切换到真机状态下执行 command+B 编译
而利用脚本来说,我们只需要运行一下脚本即可。配置好脚本之后,可以运行脚本一键生成真机版framework和模拟器版framework,省去了手动打包浪费的所有时间。
二、实现目标
2.1、sdk源码编译通过,可以手动打包生成真机版framework和模拟器版framework。
2.2、通过脚本一键生成真机版framework和模拟器版framework。
三、解决步骤
3.1、创建项目
1、打开终端,输入命令,指定到桌面目录下
cd /Users/lmy/Desktop
2、创建工程项目,执行命令
pod lib create XESTestSDK
3、配置相关选择。
选择平台
What platform do you want to use?? [ iOS / macOS ]
iOS
选择语言
What language do you want to use?? [ Swift / ObjC ]
ObjC
是否自动生成demo,选择Yes,方便以后测试
Would you like to include a demo application with your library? [ Yes / No ]
Yes
是否集成测试框架
Which testing frameworks will you use? [ Specta / Kiwi / None ]
None
UI 测试
Would you like to do view based testing? [ Yes / No ]
No
指定类前缀
配置选项What is your class prefix?
XESApp
4、执行完之后,自动打开项目。
工程项目
5、项目目录结构如下所示
目录结构
可以看到项目目录下,只有Example工程,并没有sdk的工程,下面为了保证sdk工程,编译通过,我们手动创建sdk的xcodeproj。
6、打开Xcode,点击File->New->project,选择Framework。
image.png
7、取名XESTestSDK,临时保存到/Users/lmy/Desktop/temp目录下。
image.png
8、将/Users/lmy/Desktop/temp/XESTestSDK/XESTestSDK.xcodeproj 拷贝到/Users/lmy/Desktop/XESTestSDK/XESTestSDK.xcodeproj,
将/Users/lmy/Desktop/temp/XESTestSDK/XESTestSDK内文件,合并到
/Users/lmy/Desktop/XESTestSDK/XESTestSDK
删除/Users/lmy/Desktop/temp。
image.png
9、如果我们手里有很多源代码可以提前将所有源码拷贝到 /Users/lmy/Desktop/XESTestSDK/XESTestSDK/Classes目录下。
image.png
10、打开/Users/lmy/Desktop/XESTestSDK/XESTestSDK.xcodeproj工程,将/Users/lmy/Desktop/XESTestSDK/XESTestSDK下的Assets、Classes所有文件添加到工程中。
image.png
11、如果我们添加的文件里面有swift语言开发的文件.swift文件,那我们要记得修改swift的语言版本。
image.png
12、我们还可以设置项目生成静态库或者动态库。
image.png
3.2、配置Podfile文件和pod引用
1、在 /Users/lmy/Desktop/XESTestSDK 目录下,给sdk项目添加一个Podfile文件,删除_Pods.xcodeproj文件。
image.png
2、Podfile文件内容如下所示。
image.png
3、执行pod install 或 pod update命令之后,运行XESTestSDK.xcworkspace工程运行并编译通过。
4、修改项目最低支持版本。
image.png image.png
3.3、创建打包脚本
1、设置必要参数
# framework打包脚本必要参数:
#1、代码工程目录路径,当前路径
Script_Path=`pwd`
#2、project目录,当前目录
Project_Path=`pwd`
#3、WorkSpace/Project 的名称
Project_Name="XESTestSDK"
#4、Project or WorkSpace
XcodebuildType='WorkSpace'
#5、framework的target的名称
Project_TargetName=$Project_Name
#6、输出framework的目录路径
Output_framework=`pwd`/"XESTestSDKFramework"
#7、build过程中临时文件夹路径
BUILD_DIR_TEMP=`pwd`/"buildFrameworkTemp"
#echo "\nScript_Path目录路径:"$Script_Path"\n"
#echo "\n代码工程目录路径:"$Project_Path"\n"
#echo "输出framework的目录:"$Output_framework"\n"
#echo "build过程中临时文件夹:"$BUILD_DIR_TEMP"\n"
2、创建Workspace类型编译方法archiveWorkspace()
archiveWorkspace(){
#build之前clean一下
xcodebuild clean -workspace ${Project_Name}.xcworkspace -scheme ${Project_TargetName}
#模拟器build
xcodebuild build -workspace ${Project_Name}.xcworkspace -scheme ${Project_TargetName} -configuration Release -sdk iphonesimulator OBJROOT=${BUILD_DIR_TEMP} SYMROOT=${BUILD_DIR_TEMP}
#真机build
xcodebuild build -workspace ${Project_Name}.xcworkspace -scheme ${Project_TargetName} -configuration Release -sdk iphoneos OBJROOT=${BUILD_DIR_TEMP} SYMROOT=${BUILD_DIR_TEMP}
}
3、创建Project类型编译方法archiveProject()
archiveProject(){
#build之前clean一下
xcodebuild clean -project ${Project_Name}.xcodeproj -scheme ${Project_TargetName}
#模拟器build
xcodebuild build -project ${Project_Name}.xcodeproj -scheme ${Project_TargetName} -configuration Release -sdk iphonesimulator OBJROOT=${BUILD_DIR_TEMP} SYMROOT=${BUILD_DIR_TEMP}
#真机build
xcodebuild build -project ${Project_Name}.xcodeproj -scheme ${Project_TargetName} -configuration Release -sdk iphoneos OBJROOT=${BUILD_DIR_TEMP} SYMROOT=${BUILD_DIR_TEMP}
}
4、创建打包方法buildStart()
buildStart(){
#判断Output_framework文件夹是否存在,存在则删除
if [[ -d ${Output_framework} ]]; then
rm -rf ${Output_framework}
fi
#判断BUILD_DIR_TEMP文件夹是否存在,存在则删除
if [[ -d ${BUILD_DIR_TEMP} ]]; then
rm -rf ${BUILD_DIR_TEMP}
fi
#创建Output_framework文件夹
mkdir -p ${Output_framework}
#创建BUILD_DIR_TEMP文件夹
mkdir -p ${BUILD_DIR_TEMP}
#cd到Project_Path目录下
cd $Project_Path
#根据XcodebuildType判断调用archiveWorkspace方法还是archiveProject方法
if [ "$XcodebuildType" == "WorkSpace" ];then
archiveWorkspace
else
archiveProject
fi
echo ">>>>>>>>>>>>>>>> 打包完成!!!"
}
5、脚本默认执行代码
#判断项目是否存在
if [[ -d ${Project_Path} ]]; then
#定位到源码目录下
cd $Project_Path
#调用buildStart方法
buildStart
else
echo ">>>>>>>>>>> 代码工程目录路径 不存在!!!!!!!!!"
fi
3.4、运行脚本
1、打开命令行工具,cd到脚本目录下,运行命令。
sh Framework_Archive.sh
image.png
2、运行完脚本之后,查看目录下生成了buildFrameworkTemp目录,buildFrameworkTemp目录下有Release-iphoneos、Release-iphonesimulator 两个目录内分别有真机的XESTestSDK.framework,和模拟器的XESTestSDK.framework。
image.png