web-dev-qa-db-ja.com

XcodeにSubversionリビジョン番号を挿入します

現在のSubversionリビジョン番号(svnversionによって報告される)をXcodeプロジェクトに挿入したいと思います。 Info.plist$PROJECT_DIRにリビジョン番号を挿入することができましたが、ファイルがバージョン管理されているため、これは適切な解決策ではありません。ビルドディレクトリのInfo.plistにリビジョンを挿入しようとしましたが、コード署名フェーズでエラーが発生します(これはiPhoneアプリケーションです)。

いくつかのビルドファイルを使用してリビジョン番号をアプリケーションに取得し、リビジョンを変更してもバージョン管理されたファイルが変更されないようにする簡単な方法はありますか?他のファイルとリンクし、リビジョン番号を取得する機能を提供する一時的なソースファイルを作成できるのではないかと思いました。しかし、私はそれを行う方法がわかりません。

私は他の解決策にはあまり興味がありません。 agvtool。私が欲しいのは、あまり魔法をかけずに、アプリケーションで利用できるリビジョン番号だけです。

25
zoul

もっと簡単な解決策があります:Leopardの/usr/libexec/PlistBuddyに含まれている PlistBuddy を使用します。詳細については、 関連するSO質問 に対する私の回答)を参照してください。

PlistBuddyは、Xcode内からのスクリプト実行ビルドフェーズで使用でき、処理されたplistファイルにのみ影響を与えるために使用できます。リソースのコピーフェーズの後に置くだけで、毎回実行するためにターゲットをクリーンアップする必要さえありません。値をヘッダーファイルに出力してSVNに無視させる必要もありません。

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

コード署名が発生する前にビルドフェーズを追加すると仮定すると、plistは置換された値で署名する必要があります。

37
Quinn Taylor

後世のために、プロジェクトにrevision.hを追加し、スクリプトの実行ビルドフェーズとして以下を追加することで、iPhoneアプリケーションのzoulと同様のことを行いました。

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のリビジョン番号です。最後に、私は次のコードでスクリプトの実行ビルドフェーズを作成しました:

REV=`/usr/bin/svnversion -nc ${PROJECT_DIR} | /usr/bin/sed -e 's/^[^:]*://;s/[A-Za-z]//'`
echo "BUILD_NUMBER = $REV" > ${PROJECT_DIR}/buildnumber.xcconfig

これは、新しいリビジョンがアプリケーションに定着するためにビルドする前にクリーンサイクルが必要なため、最もクリーンな方法ではない可能性がありますが、機能します。

10
Brad Larson

Stack Overflowの新規ユーザーとして、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}を二重引用符で囲んでいることに注意してください。これらは、名前にスペースを含むディレクトリ構造にプロジェクトを配置することを決定したユーザーに必要です。

これが他の人に役立つことを願っています!

8

私のiPhoneアプリで同様のことをしようとしたときにこのページを見つけ、私が決めたコードを共有することが役立つかもしれないと思いました。ターゲット情報に基本バージョン番号(たとえば0.9.5)を設定しようとしましたが、その最後にSVNリビジョン番号を追加しました。これをCFBundleVersionに保存して、ターゲット情報ペインでバージョン番号を変更するのを忘れた場合でも、アドホックユーザーがiTunes経由で更新できるようにする必要がありました。そのため、他の方法ではうまく機能する「revision.h」メソッドを使用できませんでした。これが、「バンドルリソースのコピー」ビルドフェーズの直後にスクリプト実行フェーズとして配置した最終的なコードです。

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にバージョンとして設定されているものの最後に追加する必要があります。このようにして、info plistに0.9.5のようなものを含めても、最後に.189リビジョン番号を追加して、最終バージョン番号0.9.5.189を与えることができます。

これが他の誰かに役立つことを願っています!

8
Brian Robbins

クインの答えにコメントできないので:

macPorts svnクライアントを使用している場合は、svnversionコマンドのフルパス(私の場合は/ opt/local/bin/svnversion)を含める必要がある場合があります。また、svnversionに-cオプションを追加しました。

また、混合リビジョンの2番目のバージョン番号のみに関心がある場合は、次のように「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
Gereon
# 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);
2
JM Marino

Appleスクリプトで記述された別のバージョン。previousValueの正規表現は変更される可能性があります。現在、XX.XX.XX形式(メジャー、マイナー、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
0
shader