用于编辑PROJECT-Info.plist文件的CFBundleVersion字段的Bash脚本

时间:2011-03-14 14:11:38

标签: bash edit info.plist

为了建立一个持续集成系统,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

此脚本应使用$ {BUNDLE_VERSION} .r $ {SVN_REVISION}替换“1.0”字符串(当前仅在标准输出中)。 但是,替换工作没有'N'选项,包括sed进程中的下一行和一次一行。但是PROJECT-Info.plist文件中有很多行带有“<string>[...]</string>”字符串...

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

有什么想法吗?

提前致谢并抱歉我的英语水平不好。

3 个答案:

答案 0 :(得分:26)

使用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

答案 1 :(得分:7)

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

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

答案 2 :(得分:0)

$ 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,并将1.0.6.9替换为新1.0.3文件中的bundle