Thursday 12 January 2006

Automatyczne numerowanie build'ów w Visual Studio 2003/2005

Jeśli przesiadłeś się z produktów Borlanda, pewnie dziwi Cię brak tej prostej możliwości. W Builderze wystarczyło zaznaczyć jednego checkbox'a i — voila! — każdy kolejny build programu miał podbity numer wersji.


Visual Studio nie oferuje takiej opcji. Może dlatego, że w głównej dla niego platformie - .Net - wystarczy wpisanie * zamiast części numeru wersji, by kompilator sam go uzupełniał? Problem jest ze zwykłymi binarkami, dla których numer wersji ustawiany jest na podstawie pliku *.rc .


Rozwiązanie jest kilkuetapowe. Najpierw trzeba dodać do projektu plik .rc, jeśli jeszcze takiego nie ma (panel 'Solution Explorer', RMB na projekcie, 'Add->New Item', 'Resource File'), po dodaniu utworzyć numer wersji (panel 'Resource View', RMB, 'Add->Resource', 'Version'). Kiedy projekt już posiada odpowiedni plik zasobów, należy otworzyć go w edytorze tekstowym (panel 'Solution Explorer', RMB na pliku *.rc, 'View code') i podmienić kod

VS_VERSION_INFO VERSIONINFO
FILEVERSION 1,0,0,1
PRODUCTVERSION 1,0,0,1
FILEFLAGSMASK 0x17L
#ifdef _DEBUG
FILEFLAGS 0x1L
#else
FILEFLAGS 0x0L
#endif
FILEOS 0x4L
FILETYPE 0x1L
FILESUBTYPE 0x0L
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "041504b0"
BEGIN
VALUE "FileDescription", "dxfgdfgd Application"
VALUE "FileVersion", "1, 0, 0, 1"
VALUE "InternalName", "dxfgdfgd"
VALUE "LegalCopyright", "Copyright (C) 2006"
VALUE "OriginalFilename", "dxfgdfgd.exe"
VALUE "ProductName", " dxfgdfgd Application"
VALUE "ProductVersion", "1, 0, 0, 1"
END
END
BLOCK "VarFileInfo"

na

VS_VERSION_INFO VERSIONINFO
FILEVERSION FILEVER
PRODUCTVERSION PRODUCTVER
FILEFLAGSMASK 0x17L
#ifdef _DEBUG
FILEFLAGS 0x1L
#else
FILEFLAGS 0x0L
#endif
FILEOS 0x4L
FILETYPE 0x1L
FILESUBTYPE 0x0L
BEGIN
BLOCK "StringFileInfo"
#include "VersionNo.h"
BEGIN
BLOCK "041504b0"
BEGIN
VALUE "FileDescription", "dxfgdfgd Application"
VALUE "FileVersion", STRFILEVER
VALUE "InternalName", "dxfgdfgd"
VALUE "LegalCopyright", "Copyright (C) 2006"
VALUE "OriginalFilename", "dxfgdfgd.exe"
VALUE "ProductName", " dxfgdfgd Application"
VALUE "ProductVersion", STRPRODUCTVER
END
END
BLOCK "VarFileInfo"

Teraz do projektu trzeba dodać plik VersionNo.h (panel 'Solution Explorer', RMB na projekcie, 'Add->New Item', 'Code->Header File'), w którym zdefiniowane będą użyte przed chwilą stałe. Powinien się w nim znaleźć następujący kod:

#define FILEVER  1,0,0,00001
#define PRODUCTVER 1,0,0,00001
#define STRFILEVER "1, 0, 0, 00001\0"
#define STRPRODUCTVER "1, 0, 0, 00001\0"

Ostatnim krokiem jest skłonienie IDE do uaktualniania tej informacji po każdym zbudowaniu projektu. W tym celu albo piszesz własny skrypt/program/cokolwiek, albo używasz mojego Autoincrement. Plik należy umieścić w katalogu projektu i włączyć w opcjach uruchomienie go każdorazowo po zbudowaniu projektu ('Project->Properties','Configuration->Build Events->Post-build Event', w 'Command line' należy wpisać 'Autoincrement.exe VersionNo.h'). Uff, koniec. Pamiętaj, by wybrać odpowienią konfigurację ustawiając 'Build Events'.

2 comments:

  1. Mój błąd. Oparłem się na tutorialu dotyczącym VS 7.0 - w 2003 i 2005, rzeczywiście, można użyć '.' i nie trzeba dodawać już '\0'.

    ReplyDelete
  2. A mógłbyś zrobić tak, aby zamiast ", " w STRFILEVER było "."? Przecinki np. w Konnekcie wyglądają paskudnie.

    ReplyDelete