【问题标题】:Bash script to edit CFBundleVersion field of PROJECT-Info.plist file用于编辑 PROJECT-Info.plist 文件的 CFBundleVersion 字段的 Bash 脚本
【发布时间】:2011-03-14 14:11:38
【问题描述】:

为了建立一个持续集成系统,Hudson,我编写了一个 bash 脚本来自动构建 Xcode 项目。 此外,在 Debug 配置中,有人要求我在 PROJECT-Info.plist 文件的 CFBundleRevision 字段中插入项目的 svn 修订号作为 ${BUNDLE_VERSION}.r${SVN_REVISION}。

您可以在下面找到 PROJECT-Info.plist 文件的源代码:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
[...]
    <key>CFBundleVersion</key>
    <string>1.0</string>
[...]
</dict>
</plist>

我在下面尝试了这个 bash 脚本:

sed 'N;s_^.*<key>CFBundleVersion</key>.*<string>[0-9][0-9]*\.[0-9][0-9]*</string>$_<key>CFBundleVersion</key>\
<string>'"$BUNDLE_VERSION"'\.r'"$SVN_REVISION"'</string>_' $PROJECT-Info.plist

此脚本应将“1.0”字符串替换为 ${BUNDLE_VERSION}.r${SVN_REVISION}(目前仅在标准输出中)。 但是,在没有 'N' 选项的情况下替换工作,该选项包括 sed 进程中的下一行并且一次一行。但是 PROJECT-Info.plist 文件中有很多行带有“&lt;string&gt;[...]&lt;/string&gt;”字符串...

我认为这是我处理两行之间未知字符的方式('N' 选项和任何字符的“.*”)是错误的。

有什么想法吗?

在此先感谢,并为我的英语水平不佳感到抱歉。

【问题讨论】:

  • 您需要使用适当的 XML 工具,例如为操作 XML 文件中的键和值而设计的 Python 或 Perl 模块。还有可用的 shell 实用程序,例如 xmlstarlet。 Regexes are not up to the challenge。顺便说一句,你的英语几乎是完美的。
  • 感谢您提供xmlstarlet shell 实用程序解决方案。我下载并安装了它。我明天会测试它,我会给你我的反馈。

标签: bash edit info.plist


【解决方案1】:

使用 PlistBuddy:

# cf. http://davedelong.com/blog/2009/04/15/incrementing-build-numbers-xcode
/usr/libexec/PlistBuddy -h
/usr/libexec/PlistBuddy -c "Print :CFBundleVersion" test.plist
myversion=1.0.5
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion '${myversion}'" test.plist

【讨论】:

  • 谢谢。这是正确的方法。另一个答案是非常不必要的黑客攻击。
【解决方案2】:

在这种特定情况下,您还可以使用 Xcode 的agvtool。您甚至不需要提供 PROJECT-Info.plist 文件的路径。在您的项目目录中运行:

agvtool new-version -all "$BUILD_NUMBER" # sets CFBundleVersion
agvtool new-marketing-version "$BUNDLE_VERSION" # sets CFBundleShortVersionString

【讨论】:

  • 维基链接已失效。
  • 为我工作!谢谢! agvtool 应该在 Project 文件夹中使用。
【解决方案3】:
$ myversion=1.0.3
$ perl -O777 -i.bak -pe 's|<key>CFBundleVersion</key>\\s*<string>[\d.]*</string>|<key>CFBundleVersion</key></key>'"$myversion"'<string>|' bundle

将文件bundle 移动到bundle.bak,并在新的bundle 文件中将1.0.6.9 替换为1.0.3

【讨论】:

  • 我明天回去工作的时候先试试这个解决方案。谢谢:)
  • 我很好奇,我立即尝试,效果很好!我只是如下修改了这个命令行,因为我在脚本的前面做了 .plist 文件的备份,并在最后恢复了它。 perl -0777 -pe "s|&lt;key&gt;CFBundleVersion&lt;/key&gt;\s*&lt;string&gt;[\d.]*&lt;/string&gt;|&lt;key&gt;CFBundleVersion&lt;/key&gt;&lt;string&gt;$BUNDLE_VERSION.r$REVISION&lt;/string&gt;|" PROJECT-Info.plist.bak &gt; PROJECT-Info.plist 谢谢你们俩。
猜你喜欢
  • 2010-12-05
  • 2018-10-29
  • 1970-01-01
  • 1970-01-01
  • 2022-12-15
  • 1970-01-01
  • 2021-03-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多