新しいバージョンbuildのたびに、ソフトウェアのバージョン番号を自増させます.

9872 ワード

VC 2005はSVNのバージョン番号を利用してDLLとEXEファイルのバージョン番号を生成する
TortoiseSVNの下にSubWCRevプログラムがあり、任意のパスに対応するSVNバージョンライブラリのバージョン番号を取得できます.ファイルの対応する場所に置き換えます.
VC 2005のリソースファイルは、生成されたバイナリファイルのバージョン番号を制御することができる.
VC 2005の生成前コマンドを使用して、SubWCRevを呼び出して、最新のSVNバージョン番号を取得し、生成されたバイナリファイルに書き込むことができる.
プログラムは、呼び出されたDLLバージョン番号が自身より大きいかどうかを判断することもできます.非対応のダイナミックライブラリが呼び出されないように制御します.依存性を1つ以上実行するときに保証できます.
この目的を達成するには
  • コンパイル前にsvnから現在のバージョンライブラリのバージョン番号を取得し、リソースファイル
  • に書き込む.
  • コンパイル完了後、インストールパッケージを打つと、バージョン情報
  • が読み出される.
    次の点に注意してください.
    1,svnのツールはバージョン番号を取得し、プロジェクトファイルに更新できます.

    ソースファイルと宛先ファイルが指定されている場合、SubWCRevはソースファイルを宛先ファイルにコピーし、次のようなキーワード置換を行います。


    表5.2.使用可能なコマンドラインスイッチを一覧表示
    キーワードの説明
    $WCREV$
    さぎょうコピーの中で最も高いコミットバージョンで置き換えます.
    $WCDATE$
    最高コミットバージョンの日付/時間で置き換えます.デフォルトでは国際フォーマットが使用されています:yyyy-mm-dd hh:mm:ss.オプションとして、strftime()にカスタムフォーマットを使用するように指定できます.たとえば、$WCDATE=%a %b %d %I:%M:%S %p$です.フォーマット文字のリストは、オンラインリファレンスを参照してください.
    $WCNOW$
    Replaced with the current system date/time. This can be used to indicate the build time. Time formatting can be used as described for $WCDATE$ .
    $WCRANGE$
    作業ディレクトリに更新バージョン範囲を置き換えます.作業ディレクトリが一致している場合は、単一のバージョンです.作業ディレクトリにハイブリッドバージョンが含まれている場合、または古いバージョンが含まれている場合、または故意にバージョンに更新されている場合、この範囲は100:200のようなフォーマットで表示されます.
    $WCMIXED$
    ハイブリッドバージョンがある場合はTTextで、そうでない場合は$WCMIXED?TText:FText$で置き換えます.
    $WCMODS$
    ローカルに変更がある場合は、FTextTTextに置き換え、そうでない場合は$WCMODS?TText:FText$に置き換えます.
    $WCURL$
    SubWCRevに渡された作業ディレクトリのバージョンライブラリアドレスで置き換えます.
    $WCINSVN$ FText is replaced with $WCINSVN?TText:FText$ if the entry is versioned, or TText if not.
    $WCNEEDSLOCK$ FText is replaced with $WCNEEDSLOCK?TText:FText$ if the entry has the TText property set, or svn:needs-lock if not.
    $WCISLOCKED$ FText is replaced with $WCISLOCKED?TText:FText$ if the entry is locked, or TText if not.
    $WCLOCKDATE$
    Replaced with the lock date. Time formatting can be used as described for FText .
    $WCLOCKOWNER$
    Replaced with the name of the lock owner.
    $WCLOCKCOMMENT$
    Replaced with the comment of the lock.
    次の例では、テンプレートファイルのキーワードが出力ファイルにどのように置き換えられているかを示します.
    // Test file for SubWCRev: testfile.tmpl
    
    char *Revision = "$WCREV$";
    char *Modified = "$WCMODS?Modified:Not modified$";
    char *Date     = "$WCDATE$";
    char *Range    = "$WCRANGE$";
    char *Mixed    = "$WCMIXED?Mixed revision WC:Not mixed$";
    char *URL      = "$WCURL$";
    
    #if $WCMODS?1:0$
    #error Source is modified
    #endif
    
    // End of file

    After running $WCDATE$ , the output file SubWCRev.exe path\to\workingcopy testfile.tmpl testfile.txt would looks like this:
    // Test file for SubWCRev: testfile.txt
    
    char *Revision = "3701";
    char *Modified = "Modified";
    char *Date     = "2005/06/15 11:15:12";
    char *Range    = "3699:3701";
    char *Mixed    = "Mixed revision WC";
    char *URL      = "http://project.domain.org/svn/trunk/src";
    
    #if 1
    #error Source is modified
    #endif
    
    // End of file

     
    SubWCRev.exeはコマンドラインまたはスクリプトから実行され、コマンドラインパラメータを使用して制御されます.
    SubWCRev WorkingCopyPath [SrcVersionFile DstVersionFile] [-nmdfe]
    testfile.txtはチェックする作業コピーのパスです.バージョンライブラリに直接ではなく、作業コピーに対してのみSubWCRevを使用できます.このパスは絶対パスであっても、作業ディレクトリの相対パスであってもよいです.
    SubWCRevにキーワード置換を実行させたい場合は、バージョンライブラリのバージョン、アドレスなどのフィールドをテキストファイルに保存するには、テンプレートファイルWorkingCopyPathを提供する必要があります.出力ファイルSrcVersionFileは、テンプレート置換後のバージョンです.
    いくつかのスイッチがSubWCRevの動作に影響します.複数を使用する場合は、単一のグループで指定する必要があります.たとえば、DstVersionFile-nmは使用できません.
    表5.1.使用可能なコマンドラインスイッチを一覧表示
    説明の切り替え
    -n
    If this switch is given, SubWCRev will exit with -n -m if the working copy contains local modifications. This may be used to prevent building with uncommitted changes present.
    -m
    If this switch is given, SubWCRev will exit with ERRORLEVEL 7 if the working copy contains mixed revisions. This may be used to prevent building with a partially updated working copy.
    -d
    If this switch is given, SubWCRev will exit with ERRORLEVEL 8 if the destination file already exists.
    -f
    このスイッチが与えられると、SubWCRevにはフォルダの最後の修正バージョンが含まれます.デフォルトの動作は、バージョン番号を取得するときにファイルのみを考慮することです.
    -e
    If this switch is given, SubWCRev will examine directories which are included with ERRORLEVEL 9 , but only if they are from the same repository. The default behaviour is to ignore externals.
    -x
    If this switch is given, SubWCRev will output the revision numbers in HEX.
    -X
    If this switch is given, SubWCRev will output the revision numbers in HEX, with '0X' prepended.

    この文書を参考にするhttp://tortoisesvn.net/docs/nightly/TortoiseSVN_zh_CN/tsvn-subwcrev.html


    2.バージョンをコンパイルする前にバージョン番号を取得する操作を1回実行する
     
    vc 6を例にとる、ファイルのバージョン情報はrcファイルに保存される.resファイルにコンパイルし、その他 objとともにlink.今の考え方はrcファイルを編集し、バージョン番号を2.2.4.0など2.2.4.$に変更します.WCREM$は、linkのたびにsubwcrevを使います.exeはrcファイルを処理するマクロ置換を行う.rcを呼び出します.exeは置換後の新しいファイルをコンパイルする.resを生成した後、一緒にlink.
    .rcファイルのversioninfoセグメントを次のように変更します:#ifdef_AUTOVERSIONFILEVERSION 2,2,4,$WCREV$PRODUCTVERSION 2,2,4,$WCREV$#elseFILEVERSION 2,2,4,0PRODUCTVERSION 2,2,4,0#endif...#ifdef _AUTOVERSION    VALUE "FileVersion", "2, 2, 4, $WCREV$\0"    VALUE "ProductVersion", "2, 2, 4, $WCREV$\0"#else    VALUE "FileVersion", "2, 2, 4, 0\0"    VALUE "ProductVersion", "2, 2, 4, 0\0"#endif           
    実は条件付きコンパイルです.デフォルトでは定義されていません_AUTOVERSIONは、元のfileversion,productversionを使用する.定義されている場合AUTOVERSIONは、新しいバージョン情報を使用する.
    .プロジェクトのプロパティにpre-linkページを見つけます.追加:subwcrevsubwcrev.exe . myprogram.rc myprogram.rc_rc.exe/l 0x804/fo"\release\myprogram.res"/d "_AUTOVERSION"/d "_AFXDLL""myprogram.rc_"
    最初のコマンドはmyprogramを処理します.rc,myprogramを生成する.rc_2番目のコマンドはmyprogramをコンパイルします.rc_ myprogram.res、その経路に注意してください.ここでrelease版のデフォルトパスです.ここで生成するresを元のresファイルに置き換えるのが原則である.
    f 7を押してください.バージョン情報がリフレッシュされました.svnにコミットするたびにバージョンが更新されます.
    しかし、私たちはさらに進むことができます.バージョン情報、コンパイル時間などをダイアログボックスに書き込む.実は肝心なのはpre-linkです..ファイルを作成するcpp、内容は以下の通り:const char*szBuildTime=「Build on$WCNOW$」;const char*szFullVersion="MyProgram 2.2.4.$WCREV$$WCMODS?+:$$WCMIXED?#:$";
    .ダイアログボックスOnInitDialog()に:extern const char*szBuildTime;extern const char* szFullVersion;SetDlgItemText(IDC_BUILDTIME, szBuildTime);SetDlgItemText(IDC_VERSION, szFullVersion);
    .pre-linkに2つ追加:subwcrevsubwcrev.exe . buildtime.cpp buildtime_.cppcl/c/nologo/Fo\Release\buildtime.obj/MT buildTime_.cpp
    原理はrcファイルと同じです.先に置き換えてからコンパイルする.同様に生成されたbuildtimeを保証する.OBjは元のbuildtimeを上書きする.obj
    大功を成し遂げるでも、ちょっと注意してください.vc 6のリソースエディタは、リソースを編集するたびにrcファイルを再生成する.つまり、rcの変更は削除されます.まだ良い方法が見つからないので、リソースを編集するたびに条件コンパイルの部分を手動で追加するしかありません.プロジェクトがbetaに入った後にバージョン情報を加えることをお勧めします.このときプログラムのリソースは一般的に変動しないからです.
    なお、ここではvc 6を例とするが、vc 2003、vc 2005等のコンパイル環境に適用することもできる.
    後記:プログラムによる自動修正も考えられる.FILEVERSIONを見つけて、後のバージョンをFILEVERSION 2,2,4,$WCREV$に置き換えて、subwcrevで置き換えます.rcでコンパイルします.定義する必要はありませんAUTOVERSIONマクロ