每次构建项目时,如何强制Xcode重建项目中的Info.plist文件?

Tra*_*sIV 25 xcode xcodebuild

显然,文件被缓存,因此只有在文件被更改时才会生成.我将环境变量设置为增加我的版本号,等等,并且独立于plist更新它们(实际上在项目构建设置中).是否有一个脚本可以用作脚本构建阶段来强制Info.plist更新?其他一些方便的方式?

小智 17

选择"编辑方案",然后从左侧的控件中选择"构建".

然后,添加预执行步骤,确保在"提供构建设置来自"下拉菜单中选择相关方案,然后将其添加到下面的编辑窗口中:

rm "${CONFIGURATION_BUILD_DIR}/${INFOPLIST_PATH}"
Run Code Online (Sandbox Code Playgroud)

这将删除缓存版本Info.plist,导致XCode在每次点击构建时重建它.

或者,如果您让Xcode预处理模板Info.plist文件,只需触摸模板即可

touch ${PROJECT_DIR}/${INFOPLIST_FILE}
Run Code Online (Sandbox Code Playgroud)

也有效.

调试预操作脚本

如果您犯了错误,预执行步骤不会提供任何信息.您可以通过将此行添加到脚本来调试构建变量的使用

echo "${CONFIGURATION_BUILD_DIR}/${INFOPLIST_PATH}" > ~/debug.txt
Run Code Online (Sandbox Code Playgroud)

然后检查内容~/debug.txt以验证运行前脚本是否已运行并查看您是否使用了正确的路径.

  • 它在xCode 8.2.1中不再起作用了 (3认同)

Gay*_*DDS 15

我也自动设置我的版本号.我创建了一个运行脚本构建阶段.关键是更新Info.plist而不是构建目录的目标构建目录副本.您还需要在复制包阶段之后运行您的运行脚本.可以直接编辑捆绑文件,因为在代码签名之前.您不想生成重新发明轮子的文件.

这是我的脚本:

# ---------------------------- IMPORTANT ----------------------------
# You must set GITHash to something like 'Set by build script' in the file
# file '<Project Name>-Info.plist' in the 'Supporting Files' group
# -------------------------------------------------------------------
#
# Get the version number from the tag in git and the number of commits as the build number
#
appVersion=$(git describe --long | cut -f 1 -d "-") 
appBuild=$(git describe --long | cut -f 2 -d "-") 
gitHash=$(git describe --long | cut -f 3 -d "-")
echo "From GIT Version = $appVersion Build = $appBuild"

#
# Set the version info in plist file
#
/usr/libexec/PlistBuddy -c "Set :CFBundleShortVersionString $appVersion" "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}"
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $appBuild" "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}"
/usr/libexec/PlistBuddy -c "Set :GITHash $gitHash" "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}"
echo "Updated ${TARGET_BUILD_DIR}/${INFOPLIST_PATH}"
Run Code Online (Sandbox Code Playgroud)

仅供参考我也使用以下代码自动设置版本并在"关于"选项卡上构建

NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];
NSString *appDisplayName = infoDictionary[@"CFBundleDisplayName"];
NSString *majorVersion = infoDictionary[@"CFBundleShortVersionString"];
NSString *minorVersion = infoDictionary[@"CFBundleVersion"];

self.appDescription.text = [NSString stringWithFormat:@"Dirty Dog Software\n%@\nVersion: %@(%@)",
                       appDisplayName, majorVersion, minorVersion];                           
Run Code Online (Sandbox Code Playgroud)


bos*_*acs 12

您可以尝试使用该touch命令更新时间戳,我假设是Xcode用来确定是否应该重建时间戳,例如

$ touch Info.plist
Run Code Online (Sandbox Code Playgroud)

  • 我忘了提到您可能想尝试将Info.plist添加到Run Script阶段的Output Files列表中.如果这不起作用,更好的方法可能是将"Shell脚本"目标添加到您的应用程序(在新目标 - > Mac OS X - >其他)下执行您的运行脚本阶段并将其添加为直接依赖关系您的主要目标,类似于此处:http://stackoverflow.com/questions/976454/xcode-running-a-script-before-every-build-that-modifies-source-code-directly (3认同)

dar*_*s0n 9

一种方法是使用Run Script构建阶段Info.plistInfo.plist.template文件生成,然后rm Info.plist在创建bundle之后生成.来自评论的想法Dave DeLong在他的博客上发布了这里.

如果它的缓存非常严重(即即使您没有在文件历史记录中打开Info.plist,也可以rm缓存),您可能也希望在此脚本中使用缓存版本.


小智 5

在Xcode 4中,您可以使用预构建操作来触摸信息plist.

注意:这与运行脚本构建阶段不同.在Xcode检查信息plist之前发生了预构建操作,在Xcode已经检查了信息plist之后,运行脚本构建阶段似乎发生了(这就是为什么它只在每隔一次工作).

  1. 转到编辑方案>构建>预操作
  2. 单击"+"按钮并选择"新建运行脚本操作"
  3. 在"提供构建设置"下拉列表中选择您的目标
  4. touch "${SRCROOT}/${INFOPLIST_FILE}"在脚本框中添加

  • 此预构建操作对我不起作用。它仍然以某种方式“缓存” Info.plist。例如,如果我进行清理并构建(不管该建议如何),并使用PlistBuddy从源appTarget-Info.plist或build-dir / Info.plist中提取版本信息,我将得到期望的结果,但是如果我更改项目中的版本信息而无需在重新构建前进行清理,我得到的是旧值…即使执行手动PlistBuddy -c打印也显示上述两个文件都具有我想要的新值。 (2认同)