运行 在 Xcode 中构建之前的 shell 脚本

Run a shell script before build in Xcode

我需要在 build/archiving 之前调整项目的构建和版本号。
我尝试了很多东西,但到目前为止都无济于事。

我用脚本添加了一个目标来更新数字,并将其添加为我的主要目标的第一个依赖项。但是因为我有多个依赖项,因为我的应用程序中有扩展,并且所有依赖项都由 Xcode 并行执行(或至少以随机顺序),所以这是行不通的。

我在我的方案中添加了一个预操作,结果相同。 Xcode 在继续构建之前没有等待我的预操作完成(我添加了一个 sleep 100 来测试)。

由于我正在更改内部版本号,因此脚本可以在开始任何其他操作之前完成是至关重要的,但还有一个副作用:由于 plist 文件已被删除,构建甚至会停止在构建相关目标时进行了更改。

更困难的是,我想使用 来设置我的版本和内部版本号。这显然会启动我无法控制的后台进程来更改 plists。

免责声明:我搜索了 other answers,没有找到帮助。

Xcode 有 build/archiving 的命令行工具:https://developer.apple.com/library/ios/technotes/tn2339/_index.html

因此,您可以编写 shell 脚本,首先运行您的脚本来调整 build/version 数字,然后运行 ​​xcode build/archive 作为命令行工具。

agvtools 在 Xcode 构建中不起作用。它总是会停止构建。 PlistBuddy 工作正常,尽管设置不是那么好和整洁。

我在主方案中的构建中添加了一个 Pre-Action,以在我的项目中调用一个新目标:

xcodebuild -project "${SRCROOT}/MAIN_APP.xcodeproj" -scheme BuildNumberPreProcess

在目标 BuildNumberPreProcess 我有一个 运行 脚本:

VERSION=$(head -n 1 version.txt)
BUILD=`git rev-list $(git rev-parse --abbrev-ref HEAD) | wc -l | awk '{ print  }'`

echo "${VERSION} (${BUILD})"

SCRIPT="${SRCROOT}/CLIENT/Supporting Files/set-version-in-plist.sh"

"${SCRIPT}" "${SRCROOT}/MAIN_APP/Supporting Files/Info.plist" ${VERSION} ${BUILD}
"${SCRIPT}" "${SRCROOT}/EXTENSION/Info.plist" ${VERSION} ${BUILD}
...

设置版本-plist.h:

#!/bin/sh

#  set-version-in-plist.sh
#
# usage:
# set-version-in-plist LIST VERSION BUILD
# LIST:      Info.plist path & name
# VERSION:   version number xxx.xxx.xxx
# BUILD:     build number xxxxx
#

# Location of PlistBuddy
PLISTBUDDY="/usr/libexec/PlistBuddy"

echo ":  ()"

${PLISTBUDDY} -c "Set :CFBundleShortVersionString " "";
${PLISTBUDDY} -c "Set :CFBundleVersion " "";