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

时间:2015-04-04 20:10:41

标签: ios build-process agvtool

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

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

我为我的计划添加了一个预先行动,结果相同。在继续构建之前,Xcode没有等待我的预操作完成(我添加了一个睡眠100进行测试)。

由于我正在改变内部版本号,因此脚本可以在其他任何内容开始之前完成,但是还有一个副作用:构建甚至因为plist文件被更改而停止建立相关目标。

更难的是,我想使用agvtools设置我的版本&编号。这显然会启动我无法控制的后台进程以更改plist。

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

2 个答案:

答案 0 :(得分:8)

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 $1 }'`

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 "$1: $2 ($3)"

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

答案 1 :(得分:2)

Xcode具有用于构建/存档的命令行工具:https://developer.apple.com/library/ios/technotes/tn2339/_index.html

因此,您可以编写shell脚本,首先运行脚本以调整构建版本号,然后运行xcode build / archive作为命令行工具。