场景:最近在一个老项目上实施组件化开发,直接copy以前的shell脚本,居然趟了不少坑。
xcode版本:xcode11.5,xcode12.0beta
1.支持架构
ipa包支持的架构:
i386,x86_64,供32位,64位系统上的模拟器测试
armv7,armv7s,arm64,arm64e,供真机测试
2.Xcode10
起初,shell脚本都单独写在子工程的build phase->run script里。
运行报错 Possibly there are two concurrent builds running in the same filesystem location
原因是Xcode10多了个New Build System。
参考文档:
Five Things You Must Know About Xcode 10 New Build System
如果是以new build system方式运行,构建系统会平行并发的运行不相关的tasks,加快编译速度。而主工程编译过程中,依赖的子工程开始编译,同时子工程的shell也开始执行xcodebuild,这就是并行的两个构建系统。
3.xcodebuild命令
//这里FRAMEWORK_NAME与PROJECT_NAME相同
xcodebuild -project ${SRCROOT}/${FRAMEWORK_NAME}/${FRAMEWORK_NAME}'.xcodeproj' \
-target ${FRAMEWORK_NAME} \
-arch arm64 -arch armv7 -arch arm64e -arch armv7s \
ONLY_ACTIVE_ARCH=NO \
-configuration 'Release' \
-sdk iphoneos \
shell脚本可以指定到project,target,arch,configuration,sdk。最终这个build产生的文件位于 ${FRAMEWORK_NAME}'.xcodeproj'的同级兄弟目录build里。
4.脚本代码
function compileTotalArchitures() {
if [[ ${CONFIGURATION} == 'Debug' ]]; then
exit 0
fi
FRAMEWORK_NAME=$1
WORK_DIR=${SRCROOT}/${FRAMEWORK_NAME}/'build'
DEVICE_DIR=${WORK_DIR}/'Release-iphoneos'/${FRAMEWORK_NAME}'.framework'
SIMULATOR_DIR=${WORK_DIR}/'Release-iphonesimulator'/${FRAMEWORK_NAME}'.framework'
OUTPUT_DIR=${SRCROOT}/${FRAMEWORK_NAME}/'Products'/${FRAMEWORK_NAME}'.framework'
#文件生成与子工程的build目录下
xcodebuild -project ${SRCROOT}/${FRAMEWORK_NAME}/${FRAMEWORK_NAME}'.xcodeproj' \
-target ${FRAMEWORK_NAME} \
-arch arm64 -arch armv7 -arch arm64e -arch armv7s \
ONLY_ACTIVE_ARCH=NO \
-configuration 'Release' \
-sdk iphoneos \
xcodebuild -project ${SRCROOT}/${FRAMEWORK_NAME}/${FRAMEWORK_NAME}'.xcodeproj' \
-target ${FRAMEWORK_NAME} \
ONLY_ACTIVE_ARCH=NO \
-configuration 'Release' \
-sdk iphonesimulator \
if [ -d ${OUTPUT_DIR} ]; then
rm -rf ${OUTPUT_DIR}
fi
mkdir -p ${OUTPUT_DIR}
cp -r ${DEVICE_DIR}/ ${OUTPUT_DIR}/
lipo -create ${DEVICE_DIR}/${FRAMEWORK_NAME} ${SIMULATOR_DIR}/${FRAMEWORK_NAME} \
-output ${OUTPUT_DIR}/${FRAMEWORK_NAME}
rm -r ${WORK_DIR}
}
这个脚本文件,在主工程里。
build的路径:WORK_DIR=子工程路径/'build'
编译完,查看 lipo -info 路径/xxx.framework/xxx,查看是否支持指定的架构。