【iOS开发】在Xcode中做一个.a包合成脚本

目标

楼主最近做了一个静态库工程。因为.a库是会生成模拟器和真机两个不同的包的,最后使用的时候需要使用脚本把两个包合并成一个包。并且还要把头文件放好。每次都这样做,觉得非常蛋疼,于是就研究了一下shell脚本,写了一个能自动合成.a包,并且把头文件放好的脚本。这样就可以做一个懒人了。

目标

这就是我们的目标。文件按照这种目录放好。

  • 所有文件放在MySDK里面
  • Headers里面存放所有的头文件
  • 真机和模拟器合并之后的 .a包在MySDK目录下

关于静态库的相关知识,请看这位朋友的文章iOS 静态库开发

建立一个.a库工程

由于建立.a库工程并不是我们今天的重点,所以就简单的带过。

  • 1.建立一个叫做MySDK的静态库工程
选择静态库
  • 2.在MySDK类中写一个sayHello方法
写一个简单的sayHello方法

建立一个Aggregate target

我们可以在Aggregate里面执行脚本

  • 1.添加一个target
添加一个target
  • 2.选择Aggregate,名字为HeCheng


    选择Aggregate
生成一个HeCheng的target
  • 3.新建一个运行脚本
新建一个运行脚本

接下来我们就可以在Run Script里写我们的脚本了

在这里写脚本

写脚本

把下面的脚本复制到Run Script里面

if [ "${ACTION}" = "build" ]
then

#要build的target名
target_Name=${PROJECT_NAME}
    echo "target_Name=${target_Name}"

#build之后的文件夹路径
build_DIR=${SRCROOT}/build
    echo "build_DIR=${build_DIR}"

#真机build生成的头文件的文件夹路径
DEVICE_DIR_INCLUDE=${build_DIR}/Release-iphoneos/include/${PROJECT_NAME}
    echo "DEVICE_DIR_INCLUDE=${DEVICE_DIR_INCLUDE}"

#真机build生成的.a文件路径
DEVICE_DIR_A=${build_DIR}/Release-iphoneos/lib${PROJECT_NAME}.a
    echo "DEVICE_DIR_A=${DEVICE_DIR_A}"

#模拟器build生成的.a文件路径
SIMULATOR_DIR_A=${build_DIR}/Release-iphonesimulator/lib${PROJECT_NAME}.a
    echo "SIMULATOR_DIR_A=${SIMULATOR_DIR_A}"

#目标文件夹路径
INSTALL_DIR=${SRCROOT}/Products/${PROJECT_NAME}
    echo "INSTALL_DIR=${INSTALL_DIR}"

#目标头文件文件夹路径
INSTALL_DIR_Headers=${SRCROOT}/Products/${PROJECT_NAME}/Headers
    echo "INSTALL_DIR_Headers=${INSTALL_DIR_Headers}"

#目标.a路径
INSTALL_DIR_A=${SRCROOT}/Products/${PROJECT_NAME}/lib${PROJECT_NAME}.a
    echo "INSTALL_DIR_A=${INSTALL_DIR_A}"

#判断build文件夹是否存在,存在则删除
if [ -d "${build_DIR}" ]
then
rm -rf "${build_DIR}"
fi

#判断目标文件夹是否存在,存在则删除该文件夹
if [ -d "${INSTALL_DIR}" ]
then
rm -rf "${INSTALL_DIR}"
fi
#创建目标文件夹
mkdir -p "${INSTALL_DIR}"

#build之前clean一下
xcodebuild -target ${target_Name} clean

#模拟器build
xcodebuild -target ${target_Name} -configuration Release -sdk iphonesimulator

#真机build
xcodebuild -target ${target_Name} -configuration Release -sdk iphoneos

#复制头文件到目标文件夹
cp -R "${DEVICE_DIR_INCLUDE}" "${INSTALL_DIR_Headers}"

#合成模拟器和真机.a包
lipo -create "${DEVICE_DIR_A}" "${SIMULATOR_DIR_A}" -output "${INSTALL_DIR_A}"

#打开目标文件夹
open "${INSTALL_DIR}"

fi

运行程序

选中我们刚才创建的HeCheng 这个target,然后运行


一定要选中我们写脚本的target

程序会编译一段时间,这个工程的话大概就是10秒钟就可以了。完成之后程序会打开一个文件夹,就是我们所期待的MySDK文件夹了

生成的文件

我们这个脚本,将合成后的.a库和头文件都按照我们想要的方式放好了。其他工程要用这个SDK的话,既可以直接拉MySDK文件夹过去就可以了。如果你想要其他的放法,比如不要Headers文件夹,那就,改一下脚本就可以了。

什么?你不相信.a包已经合成了?

在终端使用命令 “lipo -info .a文件路径”,看到
armv7 i386 x86_64 arm64
说明已经合成成功了


在终端使用命令 lipo -info .a文件路径

脚本解释

推荐阅读更多精彩内容

  • (原文:How to Create a Framework for iOS 作者:Sam Davies 译者:Mr...
    花无缺_阅读 3,060评论 3 20
  • 如果你想将你开发的控件与别人分享,一种方法是直接提供源代码文件。然而,这种方法并不是很优雅。它会暴露所有的实现细节...
    小热狗阅读 1,971评论 3 9
  • (原文:How to Create a Framework for iOS作者:Sam Davies 译者:Mr_...
    Yaanco阅读 1,315评论 4 4
  • 原文链接在上一篇教程(中译版)中,你学到了怎么样创建一个可复用的圆形旋钮控件。然而你可能不清楚怎样让其他开发者更方...
    _冷忆阅读 1,823评论 12 4
  • 直到有一天 我们都忘了彼此 直到有一天 我们都不在纪念 直到有一天 我们都相见笑脸 也许 今日的相逢是昨日的重演 ...
    米尔随风阅读 23评论 0 1