如何在Xcode中包含git commit hash?

Rya*_*ard 6 xcode ios

我有一个应用程序,人们可以直接从它报告错误,但我希望用户能够提交构建应用程序的git hash.Xcode是否公开了包含此信息的#define,或者我是否必须将其包含在某些自定义构建脚本中?

Rya*_*ard 12

我根据gagarwal引用的答案写了一个实现.我在编译阶段之前将此构建脚本添加到了构建阶段:

/usr/libexec/PlistBuddy -c "Set :GIT_COMMIT_HASH `git rev-parse HEAD`" "${TARGET_BUILD_DIR}"/"${INFOPLIST_PATH}"
Run Code Online (Sandbox Code Playgroud)

在我的代码中,我通过调用它来引用它:

[[NSBundle mainBundle] infoDictionary][@"GIT_COMMIT_HASH"];
Run Code Online (Sandbox Code Playgroud)

瞧,您的上次提交哈希值在运行时可用!

  • 看起来像XCode 7这个不再适用了.修复它:/ usr/libexec/PlistBuddy -c"Set:GIT_COMMIT_HASH`git rev-parse HEAD`""$ {PROJECT_DIR}/$ {INFOPLIST_FILE}" (5认同)
  • @DavidH你必须在你的信息plist中有条目,所以在构建之前我在plist中有`<key> GIT_COMMIT_HASH </ key> <string> </ string>`它在构建时填充了它. (3认同)
  • 我得到 `Set: Entry, ":GIT_COMMIT_HASH", 不存在` (2认同)
  • 重要的是在“复制捆绑资源”阶段之后在“构建阶段”中添加脚本。 (2认同)

Con*_*sky 5

Xcode 12+ 解决方案

注意:您可以避免手动修改Info.plist. 只需执行以下步骤:

  1. 添加New run script phase
  2. 插入脚本:
INFO_PLIST="${TARGET_BUILD_DIR}"/"${INFOPLIST_PATH}"

# Query and save the value; suppress any error message, if key not found.
value=$(/usr/libexec/PlistBuddy -c 'print :GitCommitHash' "${INFO_PLIST}" 2>/dev/null)

# Check if value is empty
if [ -z "$value" ] 
then
   /usr/libexec/PlistBuddy -c "Add :GitCommitHash string" "${INFO_PLIST}"
fi

/usr/libexec/PlistBuddy -c "Set :GitCommitHash `git rev-parse --short HEAD`" "${INFO_PLIST}"
Run Code Online (Sandbox Code Playgroud)
  1. $BUILT_PRODUCTS_DIR/$INFOPLIST_PATH将和添加$TARGET_BUILD_DIR/$INFOPLIST_PATHInput Files属性(重要!
  2. 确保该阶段在Copy Bundle Resources阶段之后进行

现在您可以访问提交哈希:

extension Bundle {
  var commitHash: String? {
    infoDictionary?["GitCommitHash"] as? String
  }
}

print(Bundle.main.commitHash ?? "undefined")
Run Code Online (Sandbox Code Playgroud)

Xcode 构建阶段选项卡