Введите номер версии Subversion в Xcode
Я хотел бы вставить текущий номер версии Subversion (как сообщается svnversion
) в мой проект Xcode. Мне удалось вставить номер версии в Info.plist
в $PROJECT_DIR
, но это не очень хорошее решение, так как файл имеет версию. Я попытался вставить ревизию в Info.plist
в каталоге сборки, но затем я получаю сообщение об ошибке на этапе подписи кода (это приложение для iPhone).
Есть ли простой способ получить номер версии в приложении, используя некоторые файлы сборки, чтобы измененная ревизия не изменяла файлы версий? Я подумал, может быть, я могу создать временный исходный файл, который будет связываться с другими и предоставить функцию для получения номера ревизии. Но я не знаю, как это сделать.
Меня не интересуют другие решения, т.е. agvtool
. Все, что я хочу, это номер версии, доступный для приложения, без лишней магии.
Ответы
Ответ 1
Там гораздо проще: с помощью PlistBuddy, включенный в /usr/libexec/PlistBuddy
в Leopard. Для получения дополнительной информации см. мой ответ на соответствующий вопрос SO.
PlistBuddy может использоваться на этапе сборки Script из Xcode и может использоваться только для обработки обработанного файла plist. Просто поставьте его после фазы "Копировать ресурсы", и вам даже не нужно очищать цель, чтобы она запускалась каждый раз. Вам даже не нужно печатать значение в заголовочном файле и заставить SVN игнорировать его.
echo -n ${TARGET_BUILD_DIR}/${INFOPLIST_PATH} \
| xargs -0 /usr/libexec/PlistBuddy -c "Set :CFBundleVersion `svnversion -n`"
Предполагая, что вы добавляете фазу сборки до подписания кода, ваш plist должен быть подписан с замененным значением.
Ответ 2
Для потомков я сделал что-то похожее на zoul для приложений iPhone, добавив в свой проект файл revision.h, а затем добавив следующее как этап сборки Script:
REV=`/usr/bin/svnversion -nc ${PROJECT_DIR} | /usr/bin/sed -e 's/^[^:]*://;s/[A-Za-z]//'`
echo "#define kRevisionNumber @\"$REV\"" > ${PROJECT_DIR}/revision.h
Я сделал это, чтобы получить простой номер версии, в отличие от более подробной строки, которую svnversion создает в решении zoul.
Для приложений Mac я основывал свой подход на этот пост и вместо этого создал файл buildnumber.xcconfig. В настройках сборки для цели я изменил значение On On в правом нижнем углу диалогового окна, чтобы buildnumber.xcconfig. Внутри Info.plist я отредактировал следующие строки:
<key>CFBundleVersion</key>
<string>${BUILD_NUMBER}</string>
<key>CFBundleShortVersionString</key>
<string>Version 1.0</string>
Итак, в диалоговом окне "О программе" будет отображаться строка версии, аналогичная версии 1.0 (1234), где 1234 - номер версии Subversion. Наконец, я создал фазу запуска Script со следующим кодом:
REV=`/usr/bin/svnversion -nc ${PROJECT_DIR} | /usr/bin/sed -e 's/^[^:]*://;s/[A-Za-z]//'`
echo "BUILD_NUMBER = $REV" > ${PROJECT_DIR}/buildnumber.xcconfig
Это может быть не самый чистый способ, так как для создания новой ревизии в приложении требуется чистый цикл, но он работает.
Ответ 3
Как новый пользователь для, я не могу комментировать запись Quinn, но у меня есть небольшое изменение, чтобы сделать его решение более точным, если вы используете репозиторий SVN, в котором сразу есть несколько проектов.
Используя свой подход, возвращаемый номер svnversion является последней регистрацией для всего репозитория, а не только вашей базой кода. Эта настройка позволяет для обновления быть конкретным для вашей базы кода.
REV=`svnversion -nc | /usr/bin/sed -e 's/^[^:]*://;s/[A-Za-z]//'`
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $REV" "${TARGET_BUILD_DIR}"/${INFOPLIST_PATH}
С помощью флага -c будет собрана последняя фиксация, сделанная в активной ветке/теге/соединительной линии для вашей кодовой базы в виде:, затем отрубите биты, которые вы не хотите хранить в качестве номера версии.
Также обратите внимание на двойные кавычки вокруг ${TARGET_BUILD_DIR}. Это необходимо для пользователей, которые решили разместить свой проект в структуре каталогов с пробелами в имени.
Надеюсь, это поможет другим!
Ответ 4
Я нашел эту страницу, пытаясь сделать аналогичную вещь для своего iPhone-приложения, и подумал, что было бы полезно разделить код, который я решил. Я пытался установить номер базовой версии в моей целевой информации (например, 0.9.5), но затем добавить свой номер версии SVN в конце. Мне нужно было это хранить в CFBundleVersion, чтобы пользователи AdHoc могли обновлять их через iTunes, даже если я не запомнил номер версии в панели "Информация о цели". Поэтому я не мог использовать метод "revision.h", который иначе работал красиво. Здесь конечный код, который я установил, на котором я разместил как фазу Run Script сразу после фазы сборки "Копирование запаса":
BASEVERNUM=`/usr/libexec/PlistBuddy -c "Print :CFBundleVersion" "${INFOPLIST_FILE}" | sed 's/,/, /g'`
REV=`svnversion -n`
SVNDATE=`LC_ALL=C svn info | awk '/^Last Changed Date:/ {print $4,$5}'`
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $BASEVERNUM.$REV" "${TARGET_BUILD_DIR}"/${INFOPLIST_PATH}
/usr/libexec/PlistBuddy -c "Set :BuildDateString $SVNDATE" "${TARGET_BUILD_DIR}"/${INFOPLIST_PATH}
Он должен добавить результаты svnversion в конец того, что установлено в базе Info.plist в качестве версии. Таким образом, у вас может быть что-то вроде 0.9.5 в вашем информационном plist и все еще есть номер версии .189, добавленный в конце, дающий окончательный номер версии 0.9.5.189
Надеюсь, это поможет кому-то еще!
Ответ 5
# Xcode auto-versioning script for Subversion
# by Axel Andersson, modified by Daniel Jalkut to add
# "--revision HEAD" to the svn info line, which allows
# the latest revision to always be used.
#
# modified by JM Marino to change only [BUILD] motif
# into CFBundleGetInfoString key.
#
# HOW TO USE IT: just add [BUILD] motif to your Info.plist key :
# CFBundleVersion
#
# EXAMPLE: version 1.3.0 copyright 2003-2009 by JM Marino
# with [BUILD] into CFBundleVersion key
use strict;
die "$0: Must be run from Xcode" unless $ENV{"BUILT_PRODUCTS_DIR"};
# Get the current subversion revision number and use it to set the CFBundleVersion value
#my $REV = `/usr/local/bin/svnversion -n ./`;
my $REV = `/usr/bin/svnversion -n ./`;
my $INFO = "$ENV{BUILT_PRODUCTS_DIR}/$ENV{WRAPPER_NAME}/Contents/Info.plist";
my $version = $REV;
# (Match the last group of digits without optional letter M | S):
($version =~ m/(\d+)[MS]*$/) && ($version = "" . $1);
die "$0: No Subversion revision found" unless $version;
open(FH, "$INFO") or die "$0: $INFO: $!";
my $info = join("", <FH>);
close(FH);
#$info =~ s/([\t ]+<key>CFBundleVersion<\/key>\n[\t ]+<string>.+)\[BUILD\](<\/string>)/$1$version$2/;
$info =~ s/([\t ]+<key>CFBundleVersion<\/key>\n[\t ]+<string>)\[BUILD\](<\/string>)/$1$version$2/;
open(FH, ">$INFO") or die "$0: $INFO: $!";
print FH $info;
close(FH);
Ответ 6
Так как я не могу комментировать ответ Куинна:
если вы используете клиент svn для MacPorts, может потребоваться включить полный путь команды svnversion/opt/local/bin/svnversion в моем случае. Я также добавил параметр -c для svnversion.
Кроме того, если вас интересует только вторая версия смешанных версий, добавьте команду "cut" для вызова, например:
echo -n "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}" \
| xargs -0 /usr/libexec/PlistBuddy -c "Set :CFBundleVersion `/opt/local/bin/svnversion -nc | cut -f2 -d:`"
Ответ 7
Другая версия, написанная в Apple Script. Regexp для предыдущего значения может быть изменен, в настоящее время он поддерживает только версии в формате XX.XX.XX(major, minor, svn rev).
Запуск от /usr/bin/osascript
set myVersion to do shell script "svn info | grep \"^Revision:\""
set myVersion to do shell script "echo " & quoted form of myVersion & "| sed 's/Revision: \\([0-9]\\)/\\1/'" as string
set myFile to do shell script "echo ${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/"
set theOutputFolder to myFile as string
set thePListPath to POSIX path of (theOutputFolder & "Info.plist")
tell application "System Events"
tell property list file thePListPath
tell contents
set previousValue to value of property list item "CFBundleVersion"
set previousValue to do shell script "echo " & quoted form of previousValue & "| sed 's/\\([0-9]*\\.[0-9]*\\)\\(\\.[0-9]*\\)*/\\1/'" as string
set value of property list item "CFBundleVersion" to (previousValue & "." & myVersion)
end tell
end tell
end tell