使用 Xcode 编程时,我们常常会遇到这样的情况:首先对工程进行各种配置,然后才能成功编译运行。比如生成 .a 的 fat 文件,供模拟器和真机使用;编译成 release 模式下的工程等。那么我们想:能不能通过命令行的方式,提前配置好文件,一键运行得到目的文件呢?基于 「苹果出品,必属精品」 的理念,答案应该是肯定的。没错,Xcode 中已经内嵌了 Run Script
脚本 的功能,下面简要介绍一下其使用方式。
入口
按照下面的步骤打开 Run Script 的脚本:
单击后能看到
Build Phases
选项卡下新增的条目——Run Script,这就是编写脚本的地方:步骤二
打印
新建名称为 atest
,类型为 Cocoa Touch Static Library
的工程,找到 Run Script
,输入如下语句:
if [ "${ACTION}" = "build" ]
then
echo "Hello world!"
fi
cmd + r
编译运行,点击导航条,能看到我们输入的打印语句:
这个脚本比较简单,理解起来也不难:点击编译按钮(脚本语言表示为build)后,触发了输入的脚本。然后调用 echo 语句打印出 String:
Hello world!
常用路径
1 工程所在的路径,称为 SRCROOT
, 它表示新建工程在磁盘上的具体位置;
2 编译工程后,在 Products 文件夹下会生成我们选中 target 所在的位置,在 Xcode 脚本中用 SYMROOT
来表示;
3 通过 TARGET_NAME
可以获取 target 名称。
具体语法如下:
if [ "${ACTION}" = "build" ]
then
echo ${TARGET_NAME}
echo ${SRCROOT}
echo ${SYMROOT}
fi
结果为:
atest
用户名/Desktop/atest
用户名/Library/Developer/Xcode/DerivedData/atest-dkmnpbmagcpgwqcouzgqvctdmfzv/Build/Products
自动合并 .a 文件
通过以上两个路径,可以实现一键编译 .a 文件的脚本:
if [ "${ACTION}" = "build" ]
then
# target 名称
target_name=${TARGET_NAME}
# debug + 虚拟器 模式下 target 所在路径
build_product_debug_iphonessimulator=${SYMROOT}/Debug-iphonesimulator/lib${target_name}.a
# debug + 真机 模式下 target 所在路径
build_product_debug_iphones=${SYMROOT}/Debug-iphoneos/lib${target_name}.a
# release + 虚拟器 模式下 target 所在路径
build_product_release_iphonessimulator=${SYMROOT}/Release-iphonesimulator/lib${target_name}.a
# release + 真机 模式下 target 所在路径
build_product_release_iphones=${SYMROOT}/Release-iphoneos/lib${target_name}.a
# 定义 .a 文件存放在工程路径下
product_dir=${SRCROOT}/Products/Release
if [ -d "${product_dir}" ]
then
rm -rf "${product_dir}"
fi
mkdir -p "${product_dir}"
DEVICE_DIR=${build_product_release_iphones}
SIMULATOR_DIR=${build_product_release_iphonessimulator}
INSTALL_DIR=${product_dir}/${target_name}.a
# 合并 .a 文件
lipo -create $DEVICE_DIR $SIMULATOR_DIR -output $INSTALL_DIR
open "${INSTALL_DIR}"
fi
脚本语句注释很详细, 切换路径可以生成 Debug 或者 Release 模式下 .a 的 fat 版本。
脚本运行逻辑:分别选中虚拟机和真机编译,生成不同模式下的 .a 文件。然后调用 lipo
命令合并 .a 文件,最后打开文件位置。
脚本执行时间
以上方法添加的脚本,是在编译之后运行的,那么如果想在编译之前运行脚本呢?通过编辑 Scheme 可以实现:
Scheme
输入脚本
上面实现合并脚本的过程,通过两次选择运行机器而实现,仍然有点麻烦。如果想更近一步,一键编译成功,就需要了解 xcode build
命令相关的知识,等下次展开讲。
喜欢和关注都是对我的鼓励和支持~
网友评论