gpt4 book ai didi

xcode - 如何动态设置应用程序的内部版本号而不弄脏源代码树?

转载 作者:行者123 更新时间:2023-12-02 09:18:16 25 4
gpt4 key购买 nike

我正在使用 git-svn,并且正在尝试将修订号嵌入到我的 iOS 应用程序中。目前,我有一个构建阶段,它运行以下脚本:

SVN_REVISION=$(git svn find-rev HEAD)
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $SVN_REVISION" "$INFOPLIST_FILE"

问题在于,由于存储库始终包含先前版本,因此脚本总是使我的 Info.plist 变脏。

我是否可以在不弄脏源代码树的情况下动态设置应用程序的内部版本号?

最佳答案

1) 向您的项目添加一个类型为“Aggregate”的新目标,例如您可以将其命名为“Update Info.plist Prefix Header”;只需在对话框中使用它作为“产品名称”即可。

2) 使用以下源代码向此新目标添加运行脚本构建阶段:

#!/bin/sh
SVN_REVISION=$(git svn find-rev HEAD)
echo "#define SVN_REVISION $SVN_REVISION" > "$SCRIPT_OUTPUT_FILE_0"


3) 将输出文件添加到脚本中,命名为

$(CONFIGURATION_TEMP_DIR)/InfoPlist.pch


4) 打开 iOS 应用程序的构建阶段。

5) 将您之前创建的聚合目标添加为依赖目标(将其添加到“目标依赖项”)。这意味着 Xcode 始终会先构建此目标,然后再构建您的 iOS 目标。

6) 打开 iOS 应用程序的“build设置”。

7) 搜索设置“Info.plist 预处理器前缀文件”并将其更改为与步骤 (3) 中输出文件所使用的值完全相同的值。

8) 搜索设置“预处理 Info.plist 文件”并确保其已启用。

9) 打开当前的 Info.plist 文件并将 CFBundleVersion 的值更改为 SVN_REVISION不要使用 $(SVN_REVISION) 或 ${SVN_REVISION};这不是build设置或环境变量替换,这是预处理器替换,因此只需使用 SVN_REVISION。


就是这样。每次构建 iOS 应用程序时,Xcode 首先构建聚合目标,该目标会更新 PCH 文件,当它构建 iOS 应用程序时,它将通过 C 预处理器运行 Info.plist 文件(使用 PCH 文件作为前缀) header),然后将其复制到您的应用程序。预处理器将替换 SVN_REVISION,因为它在 PCH 文件中定义为宏。

重要说明

有些人可能认为使用 $(DERIVED_FILE_DIR) 而不是 $(CONFIGURATION_TEMP_DIR) 更好。好吧,理论上它们是正确的,但实际上只有一个问题:每个目标的派生文件目录都不同,而配置临时目录是相同的(仅每个构建配置不同)。当使用派生文件目录时,PCH文件被写入聚合目标的派生文件目录,但在构建iOS应用程序时,Xcode将在iOS应用程序的派生文件目录中搜索该文件,因此找不到文件。

有些人可能还认为最好添加运行脚本阶段来更新前缀 header 作为 iOS 应用程序的第一个构建阶段,而不是为其创建单独的目标(这也将解析派生文件上面提到的 dir 问题)。再说一遍,理论上是个好主意,但在实践中行不通:如果请求预处理,则 Info.plist 在第一个脚本阶段执行之前就会进行预处理,因此如果 PCH 文件尚不存在或尚未更新,则构建因错误而终止,或者过时的 SVN 修订版本被写入 plist 文件。这就是为什么您需要为此任务建立一个单独的目标,并保证在实际目标之前构建该目标。

关于xcode - 如何动态设置应用程序的内部版本号而不弄脏源代码树?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14255425/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com