Введите номер версии 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