Xcode 4:使用 Git 存储库提交版本在每个构建上更新 CFBundleVersion

2023-11-25

我将 Xcode 4 与 Git 结合使用,并希望在每次构建时增加 Info.plist 中的 CFBundleVersion。 CFBundleVersion 键的值应更新为我对 Git 存储库所做的最后一次提交的编号。

I found thatpython 脚本运行良好,但不幸的是,它没有更新我的 Xcode 项目中的 Info.plist - 它只是更新“BUILT_PRODUCTS_DIR”中的 Info.plist。

有谁知道如何让 Xcode 4 获取最新提交的版本并将该信息放入项目的 Info.plist 中?

Thanks!


版本字符串的格式必须为 [xx].[yy].[zz],其中 x、y、z 是数字。

我通过使用来处理这个问题git tag为 x 和 y 提供有意义的特定提交标记编号(例如 0.4),然后通过脚本构建阶段,z 获取自最后一个标记以来的提交数量,如git describe.

这是我改编的剧本this one。它可以作为构建阶段直接添加到目标(shell is /usr/bin/env ruby):

# add git tag + version number to Info.plist
version = `/usr/bin/env git describe`.chomp

puts "raw version "+version
version_fancy_re = /(\d*\.\d*)-?(\d*)-?/
version =~ version_fancy_re
commit_num = $2
if ( $2.empty? )
commit_num = "0"
end
fancy_version = ""+$1+"."+commit_num
puts "compatible: "+fancy_version

# backup
source_plist_path = File.join(ENV['PROJECT_DIR'], ENV['INFOPLIST_FILE'])
orig_plist = File.open( source_plist_path, "r").read;
File.open( source_plist_path+".bak", "w") { |file| file.write(orig_plist) }

# put in CFBundleVersion key
version_re = /([\t ]+<key>CFBundleVersion<\/key>\n[\t ]+<string>).*?(<\/string>)/
orig_plist =~ version_re
bundle_version_string = $1 + fancy_version + $2
orig_plist.gsub!(version_re, bundle_version_string)

# put in CFBundleShortVersionString key
version_re = /([\t ]+<key>CFBundleShortVersionString<\/key>\n[\t ]+<string>).*?(<\/string>)/
orig_plist =~ version_re
bundle_version_string = $1 + fancy_version + $2
orig_plist.gsub!(version_re, bundle_version_string)

# write
File.open(source_plist_path, "w") { |file| file.write(orig_plist) }
puts "Set version string to '#{fancy_version}'"
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Xcode 4:使用 Git 存储库提交版本在每个构建上更新 CFBundleVersion 的相关文章

随机推荐

  • MATLAB 图形绘制:在绘图过程中分配图例标签

    我正在以典型的 MATLAB 散点图格式绘制数据 通常 在绘制多个数据集时 我会使用命令 hold on 然后绘制每个数据 然后绘制图例 legend DataSet1 DataSet2 etcetera 但是 我在同一轴上绘制的 多个 数
  • CSS 固定跨度宽度

    在无序列表中 li span span The lazy dog li li span AND span The lazy cat li li span OR span The active goldfish li 允许添加类或样式属性 但
  • 为什么 Thread 的子类可以吞咽 InterruptedException?

    在布莱恩 戈茨的书中关于如何处理 InterruptedException 的文章 有一段话很突出 接受中断的一次是当您知道线程即将退出时 仅当调用可中断方法的类是 Thread 而不是 Runnable 的一部分时 才会出现这种情况 我不
  • C# 条件日志记录/跟踪

    我想向我的 C 应用程序添加日志记录或跟踪 但如果日志详细级别设置得太低以致于不会记录消息 我不希望记录格式化字符串或计算值的开销 在 C 中 您可以使用预处理器定义宏来阻止代码被执行 如下所示 define VLOG level expr
  • 从 Subversion 部署网站

    我是 subversion 的新手 想知道如何从开发转向暂存 然后生产 我想我掌握了为发布创建分支的概念详细信息在这里 但我如何实际部署分支呢 理想情况下 我可以建立一个新网站并从分支复制文件 但我担心将任何 svn 绑定复制到生产环境中
  • 在 PHP 中解析转义的 JSON

    我是 PHP 世界的新手 在 PHP 中解析 JSON 时遇到问题 我想使用我的 Java 客户端将数据 POST 到 PHP 脚本Apache HttpClient 4 x and Gson My JSON Knt KntWatchId
  • 合并两个数组并使用 jquery 创建第三个数组

    我有 2 个数组arr1 A B C D 和 arr2 a b c d 我想通过以下方式组合这两个数组来创建第三个数组 arr3 A a B b C c D d 我怎样才能使用 jquery 实现这一点 请帮忙 尝试使用jquery的 me
  • 如何在Delphi中编写一个EXE,它也是一个COM服务器

    我有一个 Delphi 2007 应用程序 它只是一个标准的 exe 我想向它添加一个 COM 接口 我已经有一个 COM dll 它导出多个 COM 对象 并且运行良好 然而 当我尝试将 dll 中的 COM 逻辑 即 exports 和
  • C/C++/Java 中 volatile 说明符的用法

    在浏览有关多线程编程的许多资源时 通常会出现对易失性说明符的引用 很明显 至少在 C C 和 Java 版本 1 4 及更早版本 中 使用此关键字不是实现多线程之间同步的可靠方法 以下是维基百科列出的 没有解释如何 作为此说明符的典型用法
  • 在 $.ajax 成功中迭代 JSON

    当用户单击按钮时 我想返回一些数据并迭代 JSON 以便可以将结果附加到表行 此时我只是想让我的循环工作 这是我的代码 我的 JSON 返回如下 COLUMNS username password DATA foo bar button c
  • 如何在指定打印机上打印Jasper Reports?

    我想要的只是打印 Jasper 报告 而无需用户选择打印机 我搜索过但没有有效的解决方案 这是我的代码的相关部分 compile to jasper String report JasperCompileManager compileRep
  • forEach 内的异步函数与 js 循环[重复]

    这个问题在这里已经有答案了 可能的重复 javascript 使用一个回调执行一堆异步方法 我已经为这个问题苦苦挣扎了好几天 但我就是想不出一种优雅的方法来处理它 问题就在这里 我正在运行 forEach 循环 我需要知道一切何时完成 由于
  • 将非常大的 int 转换为 double,在某些计算机上会损失精度

    我目前正在学习cpp中的类型间数据转换 我被教导说 对于一个非常大的整数 我们 对于某些计算机 可能会遭受损失 转换为双精度时的精度 但该声明没有提供理由 有人可以提供解释和例子吗 谢谢 假设浮点数使用 N 位存储 现在 我们假设这个浮点数
  • JPA 工作单元克隆中遇到空或零主键

    我了解到JPA并有任务创建数据库并向其中插入一些值 我想知道如何找出最近插入的对象的ID是什么 所以我找到了一种我需要使用的方法flush的方法EntityManager 不幸的是我得到了 工作单元克隆中遇到空或零主键 当我使用上述方法时出
  • 如何检查 NSNumber 中的空值

    首先我承认我的无知 在我从事项目的几个月里 我已经学到了关于 Objective C 的一切 我还发现 Objective C 似乎使我使用过的任何其他语言中的简单问题变得复杂 这非常令人沮丧 这个问题就是一个例子 在第一次运行中 我的应用
  • 在 Android Lollipop 上使用 NFC 激活设备所有者

    我正在尝试使用 NFC 在设备上设置设备所有者包 Lollipop 概述中提到了here 要部署并激活设备所有者 您必须执行 NFC 数据 当设备处于运行状态时从编程应用程序传输到设备 其未配置状态 此数据传输发送相同的信息 如托管配置中描
  • 如何从完整的文件名列表中删除文件扩展名?

    我正在使用以下命令来获取包含名为的目录中的所有文件的列表tokens import os accounts next os walk tokens 2 Output gt gt gt print accounts DS Store Amie
  • MFC 应用程序到 Unicode/MBCS 的分段转换

    我有一个大型 MFC 应用程序 我正在扩展它以允许多语言输入 目前 我需要允许用户在单个对话框的编辑框中输入 Unicode 数据 有没有办法在不为整个应用程序打开 UNICODE 或 MBCS 的情况下执行此操作 我目前只需要转换应用程序
  • 使用 myclass::operator<(myclass &other) 对 std::list 进行排序

    我有一个std list
  • Xcode 4:使用 Git 存储库提交版本在每个构建上更新 CFBundleVersion

    我将 Xcode 4 与 Git 结合使用 并希望在每次构建时增加 Info plist 中的 CFBundleVersion CFBundleVersion 键的值应更新为我对 Git 存储库所做的最后一次提交的编号 I found th