【问题标题】:Run a shell script before build in Xcode在 Xcode 中构建之前运行一个 shell 脚本
【发布时间】:2015-06-09 15:37:58
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: ios build-process agvtool


    【解决方案1】:

    agvtools 在 Xcode 构建中不起作用。它总是会停止构建。 运行良好的是 PlistBuddy,虽然设置不是那么好和整洁。

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

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

    在目标 BuildNumberPreProcess 我有一个 Run Script

    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}
    ...
    

    set-version-in-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";
    

    【讨论】:

    • 不错的解决方案!唯一的缺点是:您的 Info.plist 文件在运行后是“脏的”,这意味着您会不断地将更新的文件检入到您的 GIT 存储库中。在完美的世界中,最好不要修改源文件,只修改构建结果中的 plist。
    • 我正在恢复后期构建脚本中的更改;)
    • 现在我遇到了另一个问题:我的 BuildNumberPreProcess-target 无法识别由 MAIN_APP-target 设置的构建配置。当我评估 $(CONFIGURATION) 时,它总是设置为“调试”。你也遇到过这个问题吗?
    • 是的。如上所述,我在 Build > Pre-actions 中从我的 Scheme 触发目标,如下所示: xcodebuild -project "${SRCROOT}/My.xcodeproj" -scheme BuildNumberPreProcess 这样所有设置都取自主目标。
    • 不完全是,但我让它工作了。 xcodebuild -project "${SRCROOT}/MAIN_APP.xcodeproj" -configuration ${CONFIGURATION} -scheme BuildNumberPreProcess 是要走的路。这样 ${CONFIGURATION} 就从 MAIN_APP 中获取。
    【解决方案2】:

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

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

    【讨论】:

    • 不错的尝试,但这确实会破坏其他东西(组织者不会知道新版本,我看不到格式化日志,...)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-02
    • 2015-10-15
    • 2017-10-07
    • 2012-12-23
    • 2010-11-01
    • 2020-09-05
    • 2020-01-01
    相关资源
    最近更新 更多