Xcode build 前添加操作
背景
在通过 MonkeyDev 创建 MonkeyApp 工程调试时,重复编译会报 Executable Not Found
的提示:
通过 ⌘ ⇧ K
操作清空缓存后可正常编译运行,虽然只多了一步操作,但长时间调试还是非常影响效率的,因此我们的目的就很明确了:通过脚本在 Xcode build 前自动清空缓存。
尝试
明确目的后,就可以尝试实现了,主要思路如下:
- 在哪里执行脚本?
- 脚本如何实现?
- 调试脚本是否正常工作
在哪里执行脚本
如果是通过命令行工具 xcodebuild
进行编译,我们可以直接在 xcodebuild
命令前执行清空缓存的脚本,但我们是在 Xcode IDE 中执行的 ⌘ r
操作来编译运行到设备上的,无法直接执行脚本。
我们知道,在 Xcode IDE 中有个 Build Phases
菜单用来配置构建阶段,而且可以添加自定义脚本:
目前还不确定该阶段执行脚本是否可行,先挖个坑在这,稍后来填,继续下一步:编写脚本。
脚本如何实现
脚本实现逻辑比较简单,主要就两步:
- 获取 build 的目录
- 删除目录
获取 build 的目录
在 Xcode IDE 中,我们可以通过环境变量 TARGET_BUILD_DIR
来获取 build 目录。
啥?你问如何查询 Xcode 提供了哪些环境变量?
这里有详细的说明:https://help.apple.com/xcode/mac/8.0/#/itcaec37c2a6
通过 echo "$TARGET_BUILD_DIR"
输出看下目录:
/Users/admin/Library/Developer/Xcode/DerivedData/TestBuild-corqiswhoijaynghttdmihqgdnab/Build/Products/Debug-iphoneos
实际我们想删除的是这个目录:
/Users/admin/Library/Developer/Xcode/DerivedData/TestBuild-corqiswhoijaynghttdmihqgdnab
因此我们对 TARGET_BUILD_DIR
获取 3 次上级目录即可:
$(dirname $(dirname $(dirname $TARGET_BUILD_DIR)))
执行删除操作
获取到目录后,使用 rm
命令进行删除即可:
echo "TARGET_BUILD_DIR:$TARGET_BUILD_DIR"
DIR=$(dirname $(dirname $(dirname $TARGET_BUILD_DIR)))
echo "DIR:$DIR"
rm -rf $DIR
调试脚本
在 Xcode Build Phases 中添加上述脚本,编译调试:
哦吼,编译报错:
提示说访问这个路径下的数据库失败了,仔细看下路径,这不就是我们删除的目录吗
error: accessing build database "/Users/admin/Library/Developer/Xcode/DerivedData/TestBuild-corqiswhoijaynghttdmihqgdnab/Build/Intermediates.noindex/XCBuildData/build.db": disk I/O error
填坑
通过上面的报错,我们知道这和我们最初的目的有点出入,我们的目的是删除上次编译后的缓存,而不是当次编译的缓存。
我们如果调整下脚本执行的时机呢?
在 Compile Sources
前执行脚本,(将脚本拖拽到前面)
编译调试,依然报错,还是没有达到我们的预期。
通过这篇文章的提示,可以在 Scheme -> Build -> Pre-actions
中配置脚本来实现 build 前添加操作:
具体步骤如下:
- 通过
⌘ ⇧ <
打开Edit Scheme
面板 - 选中
Build -> Pre-actions
- 点击
+
添加New Run Script Action
- 填入脚本内容
操作完成后进行调试,可正常编译运行,撒花🌼。