25

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

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

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

4

7 に答える 7

37

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

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

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

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

于 2009-06-30T05:38:36.337 に答える
8

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

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

于 2009-12-07T22:16:54.807 に答える
8

iPhone アプリで同様のことをしようとしているときにこのページを見つけ、決定したコードを共有すると役立つかもしれないと考えました。ターゲット情報にベース バージョン番号 (たとえば 0.9.5) を設定しようとしていましたが、最後に SVN リビジョン番号を追加しました。これを CFBundleVersion に保存して、AdHoc ユーザーがターゲット情報ペインでバージョン番号を更新することを忘れていたとしても、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}

バージョンとしてベース Info.plist に設定されているものの最後に svnversion の結果を追加する必要があります。このようにして、情報 plist に 0.9.5 のようなものを含めることができ、最後に .189 リビジョン番号が追加され、最終的なバージョン番号は 0.9.5.189 になります。

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

于 2010-01-13T00:35:36.953 に答える
2

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

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:`"
于 2012-12-20T13:48:47.693 に答える
2
# 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);
于 2009-01-31T11:21:22.890 に答える
0

Apple Script で書かれた別のバージョン。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
于 2010-01-14T10:31:14.047 に答える