私の場合のように、最初にニーズに遭遇したと仮定します
SVNソースからNSISインストーラーへの途中での体の動きを最小限に抑え、プロジェクトバージョンの自動インクリメントを関連付けます。 手動モードでは、次のようになります。
- 対応するプロジェクトソースに新しいバージョンを登録します。 これがユーザーに必要なのか、診断情報として必要なのかは関係ありません。
- セットアップに必要なプロジェクトファイルを収集します。
- nsiファイル内のバージョンを更新します。これは、インストール段階のウィンドウおよび結果のセットアップファイルの名前で使用するためです。
このようなプラクティスの脆弱性は、これらのポイントの1つまたはいくつかが見逃された緊急事態の間に発見され、その結果、ユーザーには互いに矛盾するコンポーネントが残されます。
新規であると主張することなく、以下で提供されるスクリプトは、ほぼワンクリックでC / C ++ Visual Studioプロジェクトのアセンブリを自動化し、主に単一の開発に役立ちます。
ABCD形式を使用することになっています。AとBはほとんど手動で変更されず、次の2つのパラメーターはリリースのコンパイルごとに更新されます。
- CはSVNリビジョン番号です。
- Dは増加しているアセンブリ番号です。
最初のスクリプトは、特別なヘッダーを介してファイルバージョンを更新します。このヘッダーは、.rcリソースファイルに接続し、コンパイルされたプロジェクトファイルの属性を変更します。 2番目のスクリプトは、これらを使用してNSISインストーラーを生成します。この名前には、MyApp-1.0.837.1.exeなど、現在のバージョンに関するすべての情報が反映されます。 これにより、上記のアセンブリ手順の自動化が保証されます。
自動インクリメントを実装する
SVNリビジョン番号を取得するには、ベースユーティリティSubWCRev.exeを使用します。ビルド番号を自動インクリメントするには、ビルド前イベントなしでは実行できません。たとえば、
hereまたは
hereです。
VersionInfo.hファイルを作成します。
#ifndef __VERSION_INFO_H #define __VERSION_INFO_H #define APP_NAME "MyApp" #define APP_VERSION 1,0,,0 #define APP_VERSION_S "" #define APP_DATE "" #endif
それを.rcファイルに接続します(保存したパスを示します):
#include "../src/VersionInfo.h"
最終的なバイナリのバージョンを変更します。これは、後で.nsiに必要になります。
FILEVERSION APP_VERSION PRODUCTVERSION APP_VERSION
各実行後にスクリプトタスクVersionBuild.rbに
C:\Ruby193\bin\ruby VersionBuild.rb VersionInfo.h
SubWCRev.exeから特別なキーワード$ WCREV $および$ WCNOW = $を挿入することによるVersionInfo.hへの変更が含まれます。
#define APP_VERSION 1,0,$WCREV$,1 #define APP_VERSION_S "1.0.$WCREV$.1" #define APP_DATE "$WCNOW=%d.%m.%Y %H:%M$"
#define APP_VERSION 1,0,$WCREV$,2 #define APP_VERSION_S "1.0.$WCREV$.2" #define APP_DATE "$WCNOW=%d.%m.%Y %H:%M$"
...
後続の呼び出し
SubWCRev.exe .. VersionInfo.h VersionInfo.h
SVNリビジョンと日付の現在の値を置き換えます
#define APP_VERSION 1,0,29,2 #define APP_VERSION_S "1.0.29.2" #define APP_DATE "01.11.2012 20:09"
VersionBuild.rbを実装する場合、正規表現が使用され、フォーマット(スペース/タブ)が保持されます。
FNAME = ARGV[0] file = File::read(FNAME) ANY_IN_QUOTES = Regexp.new('"[^"]*"') def replaceVersion(file)
大規模なプロジェクトでコンパイル時間の増加を避けるために、プロジェクトヘッダーにVersionInfo.hを含めるのではなく、追加のプロキシファイルを作成することをお勧めします。
#include "Version.h" #include "VersionInfo.h" const char *Version() { return APP_VERSION_S; } const char *BuildDate() { return APP_DATE; }
アセンブリセットアップの実装
以下は、デスクトップとスタートにショートカットを作成して、1つのexe(同じフォルダーにある)をインストールするための標準NSISファイルです。
!include "MUI.nsh" ; ;!define APP_NAME "MyApp" ;!define MAJOR_VERSION "1" ;!define MINOR_VERSION "0" ;!define SVN_REVISION "29" ;!define BUILD_NUMBER "2" ;!define APP_VERSION "${MAJOR_VERSION}.${MINOR_VERSION}.${SVN_REVISION}.${BUILD_NUMBER}" ;!define SETUP_NAME "${APP_NAME}-${APP_VERSION}.exe" Name ${SETUP_NAME} OutFile ${SETUP_NAME} InstallDir $PROGRAMFILES\${APP_NAME} VIProductVersion ${APP_VERSION} VIAddVersionKey "ProductName" ${APP_NAME} VIAddVersionKey "Comments" "" VIAddVersionKey "CompanyName" "" VIAddVersionKey "LegalTrademarks" "" VIAddVersionKey "LegalCopyright" "© " VIAddVersionKey "FileDescription" ${APP_NAME} VIAddVersionKey "FileVersion" ${APP_VERSION} !define MUI_ABORTWARNING !insertmacro MUI_PAGE_WELCOME !insertmacro MUI_PAGE_COMPONENTS !insertmacro MUI_PAGE_DIRECTORY !insertmacro MUI_PAGE_INSTFILES !insertmacro MUI_PAGE_FINISH !insertmacro MUI_UNPAGE_WELCOME !insertmacro MUI_UNPAGE_CONFIRM !insertmacro MUI_UNPAGE_INSTFILES !insertmacro MUI_UNPAGE_FINISH !insertmacro MUI_LANGUAGE "Russian" Section "${APP_NAME} (required)" SetOutPath $INSTDIR File "${APP_NAME}.exe" WriteUninstaller "uninstall.exe" SectionEnd Section "Uninstall" Delete "$INSTDIR\*.*" Delete "$SMPROGRAMS\${APP_NAME}\*.*" Delete "$DESKTOP\${APP_NAME}.lnk" RMDir "$SMPROGRAMS\${APP_NAME}" RMDir "$INSTDIR" SectionEnd Section "Start Menu and Desktop Shortcuts" CreateDirectory "$SMPROGRAMS\${APP_NAME}" CreateShortCut "$SMPROGRAMS\${APP_NAME}\Uninstall.lnk" "$INSTDIR\uninstall.exe" "" "$INSTDIR\uninstall.exe" 0 CreateShortCut "$DESKTOP\${APP_NAME}.lnk" "$INSTDIR\${APP_NAME}.exe" SectionEnd
さらに、定数を手動で設定する代わりに、定義して、定数APP_NAMEおよびAPP_VERSIONをmakensis.exeユーティリティに転送します。 SetupBuild.rbスクリプトがこれを処理し、コンパイルされたバイナリファイルの名前を入力します。
C:\Ruby193\bin\ruby SetupBuild.rb MyApp.exe
たとえば、コンパイル後にMyApp.exeにAPP_VERSION_S = "1.0.29.2"が含まれていた場合、スクリプトはファイル属性から文字列バージョンを要求し、成功した場合、MyApp-1.0.29.2.exeインストールファイルを作成します。メモ帳。
ソースパッケージSetupBuild.rbをダウンロードします。
NSIS_MAKE = '"C:\Program Files (x86)\NSIS\makensis.exe"' require 'win32ole' def versionOf(fname) fso = WIN32OLE.new("Scripting.FileSystemObject") return fso.GetFileVersion(fname) end def alert(msg) fso = WIN32OLE.new("WScript.Shell") fso.Popup msg end SRC_FNAME = File::expand_path(ARGV[0]) APP_NAME = File::basename(SRC_FNAME, '.*') params = Hash.new params['APP_NAME'] = APP_NAME params['APP_VERSION'] = versionOf(SRC_FNAME) params['SETUP_NAME'] = "#{APP_NAME}-#{params['APP_VERSION']}.exe"
使用する
Visual Studio 2008テストSVNプロジェクトは
こちらです。
必要なインストール:
リリースでは、[プロジェクト]-> [プロパティ]-> [ビルドイベント]-> [ビルド前イベント]-> [コマンドラインが設定されています]
C:\Ruby193\bin\ruby "..\src\VersionBuild.rb" "..\src\VersionInfo.h" SubWCRev.exe .. "..\src\VersionInfo.h" "..\src\VersionInfo.h"
コンテンツでsetup \ SetupBuild.batを実行する場合
C:\Ruby193\bin\ruby SetupBuild.rb MyApp.exe
セットアップファイルMyApp-1.0.xyexeが生成されます。xはSVNバージョン番号、yはコンパイルシーケンス番号です。
SetupBuild.batをビルド後イベントに配置すると、インストーラーは再コンパイルのたびに収集されます。