Вставьте номер версии Subversion в Xcode - PullRequest
25 голосов
/ 16 декабря 2008

Я хотел бы вставить номер текущей версии Subversion (как сообщается svnversion) в мой проект Xcode. Мне удалось вставить номер ревизии в Info.plist в $PROJECT_DIR, но это не очень хорошее решение, так как файл имеет версию. Я пытался вставить ревизию в Info.plist в каталоге сборки, но затем я получаю сообщение об ошибке на этапе подписания кода (это приложение для iPhone).

Существует ли простой способ получить номер ревизии в приложении, используя некоторые файлы сборки, чтобы изменяющаяся ревизия не изменяла версионные файлы? Я подумал, что, возможно, мне удастся создать временный исходный файл, который будет связываться с другими и предоставлять функцию для получения номера ревизии. Но я не знаю, как это сделать.

Меня не очень интересуют другие решения, т.е. agvtool. Все, что я хочу, это номер версии, доступной для приложения, без особой магии.

Ответы [ 7 ]

37 голосов
/ 30 июня 2009

Существует гораздо более простое решение: использование PlistBuddy , включается в /usr/libexec/PlistBuddy в Leopard. См. мой ответ на связанный вопрос SO для получения подробной информации.

PlistBuddy можно использовать на этапе сборки Run Script изнутри Xcode, и он может влиять только на обработанный файл plist. Просто поместите его после фазы копирования ресурсов, и вам даже не нужно будет очищать цель, чтобы она запускалась каждый раз. Вам даже не нужно печатать значение в заголовочный файл и заставлять SVN его игнорировать.

echo -n ${TARGET_BUILD_DIR}/${INFOPLIST_PATH} \
    | xargs -0 /usr/libexec/PlistBuddy -c "Set :CFBundleVersion `svnversion -n`"

Если вы добавите фазу сборки до того, как произойдет подписывание кода, ваш список должен быть подписан с подставленным значением.

10 голосов
/ 06 января 2009

Для потомков я сделал что-то похожее на приложения zoul для iPhone, добавив в свой проект файл revision.h, а затем добавил следующее в качестве фазы сборки Run 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. В настройках сборки для цели я изменил значение «На основе» в нижнем правом углу диалогового окна на buildnumber.xcconfig. В Info.plist я отредактировал следующие строки:

<key>CFBundleVersion</key>
<string>${BUILD_NUMBER}</string>
<key>CFBundleShortVersionString</key>
<string>Version 1.0</string>

Чтобы в моем диалоговом окне «О программе» отображалась строка версии, аналогичная версии 1.0 (1234), где 1234 - номер версии Subversion. Наконец, я создал фазу сборки Run 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

Это может быть не самый чистый способ, так как перед сборкой требуется цикл очистки, чтобы новая редакция закрепилась в приложении, но это работает.

8 голосов
/ 13 января 2010

Я нашел эту страницу, пытаясь сделать аналогичную вещь для своего приложения для iPhone, и подумал, что было бы полезно поделиться кодом, который я выбрал. Я пытался установить базовый номер версии в моей целевой информации (например, 0.9.5), но затем в конце добавляю свой номер версии SVN. Мне нужно, чтобы это было сохранено в CFBundleVersion, чтобы пользователи AdHoc могли обновляться через iTunes, даже если я не помню, чтобы изменить номер версии в моей панели Target Info. Вот почему я не мог использовать метод "revision.h", который в остальном работал прекрасно. Вот окончательный код, который я установил, и который я поместил как фазу Run Script сразу после фазы сборки «Copy Bundle Resources»:

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 в своем информационном листе и в конце добавить номер ревизии .189, что дает окончательный номер версии 0.9.5.189

Надеюсь, это поможет кому-то еще!

8 голосов
/ 08 декабря 2009

Как новый пользователь Stack Overflow, я не могу комментировать пост Куинна, но у меня есть небольшое изменение, чтобы сделать его решение немного более точным, если вы используете 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}. Они нужны пользователям, которые решили разместить свой проект в структуре каталогов с пробелами в имени.

Надеюсь, это поможет другим!

2 голосов
/ 20 декабря 2012

Поскольку я не могу комментировать ответ Куинна: ​​

если вы используете клиент MacPorts svn, может потребоваться указать полный путь к команде 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:`"
2 голосов
/ 31 января 2009
# 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);
0 голосов
/ 14 января 2010

Еще одна версия, написанная в Apple Script. Регулярное выражение для предыдущего значения может быть изменено, в настоящее время оно поддерживает только версии в формате 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...