2009-04-25 10 views
12

私はexeまたはdllファイルをビルドするC++プロジェクトをいくつか持っています。プロジェクトはSVNリポジトリにチェックインされます。自動的にSVNからのリビジョンと、exe/dllファイルに埋め込まれたバージョンリソースとを同期させたい、つまりバージョンは$ major。$ minor。$ svn_revisionのようにする必要があります。
これを達成するためのアイデアはありますか?すぐに使えるソリューションはありますか?EXE/DLLファイルのSVNリビジョンとバージョンressourcesを同期させるには?

答えて

11

TortoiseSVNがインストールされている場合、インストールされているプログラムはSubWCRevです。

、あなたのファイルで、この値がある場合:

SubWCRev .\ yourfile.txt.template yourfile.txt 

この意志:

$WCREV$ 

をあなたはこのような何かを実行する場合、それは最高のコミットリビジョン番号に置き換えられますyourfile.txt.templateからコピーし、置換を行い、yourfile.txtに書き込みます。

他にも多くのマクロがありますが、引数なしでSubWCRevを実行すると、それらはすべてコンソールに一覧表示されます。

+4

SubWCRevは、TortoiseSVNを使用しない(希望している)人には別途入手できます。http://sourceforge.net /project/showfiles.php?group_id=138498&package_id=281312 – Stefan

+0

クール、私はそれを知らなかった! –

+0

よくわかります:) –

2

Subversion PropertiesSubversion Keywordsを調べるとよいでしょう。リソースの問題を解決することはありません。なぜなら、彼らはいつもその気持ちを含むからです。$KeywordName: ...$ 部分です。カスタムプロパティは、メタデータをバッチファイルで利用できるようにするための素晴らしい方法を提供します。

とにかく、私は数年前にリソース問題の解決策を探していましたが、それを見つけられませんでした。そこで、私たちは独自の自社開発のソリューションを作成しました。ビルドプロセス中に生成されたヘッダーファイルを含めるようにRCファイルを変更しました。 RCはヘッダーに依存し、ヘッダーにはヘッダーを生成するためのバッチファイルを呼び出すカスタムビルドルールがありました。次のスニペットは、出力から現在のリビジョンを抽出します。svn info

SET rootdir=%1 
SET svnrev=0 
PUSHD "%rootdir%" 
FOR /F "tokens=1-4 delims=: " %%I IN ('svn info') DO (
    IF /I {%%I}=={rev} SET svnrev=%%L 
) 
(ECHO./* 
ECHO. * version-stamp.h - repository version information 
ECHO. */ 
ECHO.#ifndef VERSION_STAMP_H 
ECHO.#define VERSION_STAMP_H 
ECHO.#define REPOSITORY_VERSION %svnrev% 
ECHO.#endif) > include\version-stamp.h 
POPD 

はその後、我々は次のように見えたcomponent-info.hという名前のコンポーネントの特定のバージョンスタンプヘッダーを作成しました:

#ifndef component_info_h 
#define component_info_h 
#include "product-info.h" 
#include "version-stamp.h" 

#define VERS_MAJOR 1 
#define VERS_MINOR 2 
#define VERS_PATCH 3 
#define VERS_BUILD REPOSITORY_VERSION 

#define MY_COMPONENT_NAME "TPS Report Generator"  
#define MY_VERSION_NUMBER VERS_MAJOR,VERS_MINOR,VERS_PATCH,VERS_BUILD 
#define MY_VERSION_STRING VERSION_STRING(VERS_MAJOR,VERS_MINOR,VERS_PATCH,VERS_BUILD) 

#endif 

は最後に、我々はproduct-info.hという名前の製品情報を定義し、製品ラインバージョンのファイルを持っていた:

#ifndef product_info_h 
#define product_info_h 

#define PROD_VERS_MAJOR 0 
#define PROD_VERS_MINOR 1 
#define PROD_VERS_PATCH 0 
#define PROD_VERS_BUILD 0 

#define VSTR1(s) #s 
#define VSTR(s) VSTR1(s) 
#define VERSION_STRING(a,b,c,d) VSTR(a) "." VSTR(b) "." VSTR(c) "." VSTR(d) "\0" 

#define MY_COMPANY_NAME   "IniTech\0" 
#define MY_COPYRIGHT   "Copyright ©2009 " MY_COMPANY_NAME 
#define MY_PRODUCT_NAME   "\0" 
#define MY_PRODUCT_VERSION_NUM PROD_VERS_MAJOR,PROD_VERS_MINOR,PROD_VERS_PATCH,PROD_VERS_BUILD 
#define MY_PRODUCT_VERSION_STR VERSION_STRING(PROD_VERS_MAJOR,PROD_VERS_MINOR,PROD_VERS_PATCH,PROD_VERS_BUILD) 
#endif 

リソースファイルにはcomponent-info.hが含まれ、適切なplでさまざまな定義が使用されますエース(例えば、FILEVERSION MY_VERSION_NUMBER)。この構造により、バージョンスタンピングプロセス全体で多くの柔軟性とトレーサビリティが得られました。それはバッチファイルの単純な塊からこの多レベルの怪物に成長しましたが、ここ数年は私たちのために非常にうまくいっています。

誰もまだこれを行うより良い方法を見つけていないとは思えません。それから、私は何年もそれを調べていません。私はあなたがこれを処理するカスタムツールを定義するカスタム.rulesファイルを追加できると思います。

3

これは大きな助けになりました。ありがとうございます。 Visual Studio 2008のためにこれを洗練しました。

1 /作成した/各プロジェクト内のフォルダを作成し

/AssemblyInfo.cs.txtとしてビルドフォルダにAssemblyInfo.csをコピーし、ビルドアクションを設定する2

に "なし"

3 /編集バージョンを持っているAssemblyInfo.cs.txtは、以下のように属性:

[assembly: AssemblyVersion("2.0.0.$WCREV$")] 
[assembly: AssemblyFileVersion("2.0.0.$WCREV$")] 

4 /追加事前に作成イベントに次

SubWCRev $(SolutionDir) $(ProjectDir)\Build\AssemblyInfo.cs.txt $(ProjectDir)\Properties\AssemblyInfo.cs 

これはコンパイルするたびに機能します。

私はUPDATEのVisual Studio 2008

でVisualSVN/TortoiseSVNのとVisualSVN Serverを使用しています:

私の同僚は、ちょうど彼の作業コピーを更新したとAssemblyInfo.csが競合です。明らかだ。私はこれを解決するためにVisualSVNを使用してSVNから除外しました。

3

Program.Xの回答は素晴らしいです。しかし、変更をコミットする前に実行可能ファイルをビルドすると、実行中のコードの実際のリビジョン番号より1つ少ないリビジョンになることを、私は付け加えたいと思います。これを緩和するために、あなたがいない場合はローカル変更がある場合は最後に1を入れて、0になる

"2.0.$WCREV$.$WCMODS?1:0$" 

にバージョンを設定することができます。したがって、後で実行可能ファイルを見て2.0.54.1を見ると、おそらく実際にはリビジョン55となることがわかります。

+0

WCREVで利用可能なキーワードに関する詳細はこちら:http://tortoisesvn.net/docs/release/TortoiseSVN_en/tsvn-subwcrev-keywords.html –

+0

良い点。私は気付いていましたが、これにフラグを立てるための良い回避策のように見えます。 –

+1

バージョンが本当にSVNコンテンツの1:1ビルドか変更されたビルドであるかどうかを確認できるので、私はこれが好きです。 – Stiefel

関連する問題