RubyでのC / C ++プロジェクトのバージョン管理とアセンブリの簡単な自動化

私の場合のように、最初にニーズに遭遇したと仮定します

SVNソースからNSISインストーラーへの途中での体の動きを最小限に抑え、プロジェクトバージョンの自動インクリメントを関連付けます。 手動モードでは、次のようになります。



このようなプラクティスの脆弱性は、これらのポイントの1つまたはいくつかが見逃された緊急事態の間に発見され、その結果、ユーザーには互いに矛盾するコンポーネントが残されます。



新規であると主張することなく、以下で提供されるスクリプトは、ほぼワンクリックでC / C ++ Visual Studioプロジェクトのアセンブリを自動化し、主に単一の開発に役立ちます。



ABCD形式を使用することになっています。AとBはほとんど手動で変更されず、次の2つのパラメーターはリリースのコンパイルごとに更新されます。



最初のスクリプトは、特別なヘッダーを介してファイルバージョンを更新します。このヘッダーは、.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) #   APP_VERSION matcher = Regexp.new('APP_VERSION\s*[^\r\n]*') line = file.match(matcher)[0] old_ver = /(\d+),(\d+),(.*),(\d+)/ line.match(old_ver) new_ver = [$1, $2, "$WCREV$", $4.to_i + 1] line.sub!(old_ver, new_ver.join(",")) file.sub!(matcher, line) #   APP_VERSION_S matcher = Regexp.new('APP_VERSION_S\s*' + ANY_IN_QUOTES.source) line = file.match(matcher)[0] line.sub!(ANY_IN_QUOTES, '"' + new_ver.join(".") + '"') file.sub!(matcher, line) end def replaceDate(file) #   APP_DATE matcher = Regexp.new('APP_DATE\s*' + ANY_IN_QUOTES.source) date = file.match(matcher)[0] date.sub!(ANY_IN_QUOTES, '"$WCNOW=%d.%m.%Y %H:%M$"') file.sub!(matcher, date) end replaceVersion(file) replaceDate(file) File::write(FNAME, 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" # /D        NSIS ( !define) cmd = params.map{|key, val| "/D#{key}=#{val}"}.join(" ") LOG_FNAME = "#{APP_NAME}_#{$0}.log" r = system("#{NSIS_MAKE} #{cmd} #{APP_NAME}.nsi > #{LOG_FNAME}") if r File::delete(LOG_FNAME) else system('notepad', LOG_FNAME) end
      
      







使用する



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をビルド後イベントに配置すると、インストーラーは再コンパイルのたびに収集されます。



All Articles