Скрипт Bash для редактирования поля CFBundleVersion файла PROJECT-Info.plist - PullRequest
9 голосов
/ 14 марта 2011

Чтобы внедрить систему непрерывной интеграции, Хадсон, я написал скрипт bash для автоматической сборки проекта Xcode. Более того, в конфигурации отладки меня попросили вставить номер редакции svn проекта в поле CFBundleRevision файла PROJECT-Info.plist как $ {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 есть много строк со строкой "<string>[...]</string>" ...

Я думаю, что мой способ обработки неизвестных символов между двумя строками (опция 'N' и ". *" Для любых символов) неправильный.

Есть идеи?

Заранее спасибо и извините за мой плохой уровень в английском.

Ответы [ 3 ]

27 голосов
/ 15 марта 2011

Использовать 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
7 голосов
/ 09 мая 2012

В этом конкретном случае вы также можете использовать Xcode's agvtool. Вам даже не нужно указывать путь к файлу PROJECT-Info.plist. Внутри вашего проекта:

agvtool new-version -all "$BUILD_NUMBER" # sets CFBundleVersion
agvtool new-marketing-version "$BUNDLE_VERSION" # sets CFBundleShortVersionString
0 голосов
/ 14 марта 2011
$ 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 файле.

...