Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   SVN Revision als Buildnummer nutzen in Delphi (https://www.delphipraxis.net/139374-svn-revision-als-buildnummer-nutzen-delphi.html)

Daimonion 27. Aug 2009 16:21


SVN Revision als Buildnummer nutzen in Delphi
 
Hallo Leute

Ihr kennt das ja sicherlich. Viele Supportanfragen von Kunden und keiner weiß mehr genau welche Version der Software beim Kunden läuft. Dann geht das Gesuche und Gefrage los. Auch mir geht es ab und zu so und diesem Dilemma möchte ich etwas besser vorbeugen, indem ich die Buildnummer meiner Software nicht mehr einfach nur noch automatisch größer werden lasse, sondern diese am durch die Revisionnummer meiner Versionsverwaltung (SVN) ersetze.
Unser SVN Server läuft auf einem Apache und als Client verwenden wir TortoiseSVN.

Gibt es in Delphi einen Möglichkeit die Revisionsnummer beim Kompilieren mit auszulesen und als Buildnummer zu nutzen? Ich denke da vielleicht an ein kleines Skript, welches mir vor dem Compilierungsvorgang die Revision ausliest und in eine Variable schreibt. (Idealerweise die, die die Buildnummer definiert.)


Grüße
Daimonion

Bernhard Geyer 27. Aug 2009 16:25

Re: SVN Revision als Buildnummer nutzen in Delphi
 
neuere Delphi-Versionen haben Post-Compile-Events wo sowas einfach einzubauen wäre.
Ansonsten schau dir mal FinalBuilder an.

Daimonion 27. Aug 2009 16:30

Re: SVN Revision als Buildnummer nutzen in Delphi
 
Das hört sich doch schon mal gut an. Da hab ich auch gleich wieder einen Grund mehr meinen Chef von einer neueren IDE zu überzeugen.

Inwieweit könnte sich das denn mit solchen Post-Compile-Events realisieren lassen.

FinalBuilder ist sicherlich nicht schlecht, aber ich wage mal zu behaupten, dass die Anzahl unserer Commits zu klein ist, um so einen automatisierten Buildprozes zu benötigen. Eine Lösung für mein Problem wäre es dennoch.

Wie macht Delphi das denn mit den Versionsnummern? Kann man die irgendwo manuell in den Sourcen einstellen, oder sind die nur über die Projekteinstellungen und dessen Dialoge verfügbar?

Noch nutzen wir Delphi5, wollen aber demnächst auf RadStudio 2009 oder RadStudio 2010 umsteigen.

generic 27. Aug 2009 16:31

Re: SVN Revision als Buildnummer nutzen in Delphi
 
Jupp das ist kein Problem auch OHNE die Hooks.

"svn:keywords" ist das Stichwort.

Zitat:

4.17.1.1. svn:keywords
Subversion supports CVS-like keyword expansion which can be used to embed filename and revision information within the file itself. Keywords currently supported are:

$Date$
Date of last known commit. This is based on information obtained when you update your working copy. It does not check the repository to find more recent changes.

$Revision$
Revision of last known commit.

$Author$
Author who made the last known commit.

$HeadURL$
The full URL of this file in the repository.

$Id$
A compressed combination of the previous four keywords.


To find out how to use these keywords, look at the svn:keywords section in the Subversion book, which gives a full description of these keywords and how to enable and use them.

For more information about properties in Subversion see the Special Properties .
die lässt du dir einfach ein eine datei als resource, text oder was auch immer schreiben.

Daimonion 27. Aug 2009 22:43

Re: SVN Revision als Buildnummer nutzen in Delphi
 
Cool, danke für den Hinweis.

Ich werd mir das Kapitel mal näher anschauen und versuchen das in Verbindung mit meinem derzeitigen Delphi Compiler als Automatismus reinzubringen.

So long
Daimonion

pertzschc 28. Aug 2009 00:16

Re: SVN Revision als Buildnummer nutzen in Delphi
 
Zitat:

Zitat von Daimonion
Das hört sich doch schon mal gut an. Da hab ich auch gleich wieder einen Grund mehr meinen Chef von einer neueren IDE zu überzeugen.
Wie macht Delphi das denn mit den Versionsnummern? Kann man die irgendwo manuell in den Sourcen einstellen, oder sind die nur über die Projekteinstellungen und dessen Dialoge verfügbar? Noch nutzen wir Delphi5...

Wir machen das mit ANT-Skripten. Darin bauen wir eine cfg-Datei für den Kompiler und kompilieren unsere Projekte mit BCC32.exe. Beim Aufbau der cfg-Datei lesen wir die entsprechende SVN-Revisionsnummer, die dem Stand der Sourcen auf dem Rechner entspricht und setzen diese als Buildnummer im cfg ein. Wir benutzen Delphi 7. Falls Du gleich noch ein Setup z.B. mit Innosetup haben willst, auch dessen ISS Datei lässt sich so mit der Build/Revisionsnummer versehen und auch per Kommandozeile kompilieren.

Gruß,
Christoph

Daimonion 28. Aug 2009 09:14

Re: SVN Revision als Buildnummer nutzen in Delphi
 
Auch hier muß ich sagen, dass der Aufwand das Ergebnis nicht rechtfertigen würde. Es ist zwar definitiv die Lösung für mein Problem, aber durch die sehr geringe Anzahl der commits würde es sich nicht rechnen ein automatisiertes Build zu realisieren.

Mit den SVN:Keywords in Verbindung mit der richtigen Stelle der Revisionsnummer (Ich hab schon gesucht und gefunden wo sie hinterlegt ist) denke ich erst mal das gewünscht Ergebnis erzielen zu können.

Danke für eure Hilfe.


Grüße
Daimonion

generic 28. Aug 2009 09:22

Re: SVN Revision als Buildnummer nutzen in Delphi
 
Zitat:

Zitat von Daimonion
richtigen Stelle der Revisionsnummer (Ich hab schon gesucht und gefunden wo sie hinterlegt ist)

Du brauchst doch nur die VersionInformationen selbst erzeugen und dann als Resource Compilieren und einbinden.

Natürlich muss du dann das einbinden von der Delphi Versionsinfo unterbinden. Aber dafür gibt ja eine Checkbox.

Daimonion 28. Aug 2009 09:26

Re: SVN Revision als Buildnummer nutzen in Delphi
 
Das geht natürlich auch!

Edit:

Wie sieht denn die Syntax innerhalb des Resource File aus, für die Versionsinformation? Ich hab im Netz nur Anleitungen mit Bildern bzw. Localization Tables gefunden.

Phoenix 28. Aug 2009 10:23

Re: SVN Revision als Buildnummer nutzen in Delphi
 
Schau Dir die Resource Deines Projektes mal mit dem Resource Hacker an. Dort siehst Du die Syntax für die .rc Resource-Scripte, die Du dann mit dem Brc32.exe Resource compiler in die einzulinkende Resource kompilieren kannst.

In diese .rc Datei fügst Du dann das SVN-Keyword ein und *wuppdi* hast Du ein .rc - File mit den richtigen Versionsinformationen. Das einzige Problem ist, dass Du diese .rc-Datei eben vor dem Kompilieren des Projektes in die .dcr (Delphi Compiled Resource) Datei kompilieren musst. Das geht eben ab Delphi 2006 mit den Pre-Build events.

Alternativ könnt ihr natürlich auch eine .drc mit Einchecken, so dass das COmpilieren aus der IDE heraus funktioniert. Wenn Ihr dann ein Build für Kunden macht müsst ihr halt vorher die Resource neu Kompilieren. Das ganze lässt sich aber mit einem Batch-File auch relativ einfach automatisieren.

Daimonion 28. Aug 2009 10:54

Re: SVN Revision als Buildnummer nutzen in Delphi
 
Also ich hab jetzt zum einen das rc file in ein res File kompiliert (mit BRCC32) In meinem Projekt hab ich dann dieses ResFile mittels

Delphi-Quellcode:
{$R 'Version.res' 'Version.rc'}
eingefügt. Funktioniert auch soweit ganz gut.

Als Alternative hab ich direkt das RC File in meinem Projekt hinzugefügt und dann kompiliert er es direkt mit, wenn ich ein Build erstelle.

Das einzige Problem, was ich derzeit noch habe sind ein paar Hieroglyphen.

So sieht die Quelle aus:

Delphi-Quellcode:
1 VERSIONINFO
FILEVERSION 4,3,5,407
PRODUCTVERSION 4,3,5,407
FILEOS 0x4
FILETYPE 0x1
{
BLOCK "StringFileInfo"
{
   BLOCK "040704E4"
   {
      VALUE "CompanyName", "Zebra Elektrotechnik"
      VALUE "FileVersion", "4.3.5"
      VALUE "InternalName", "LAP"
      VALUE "LegalCopyright", "Copyright Zebra"
      VALUE "LegalTrademarks", ""
      VALUE "OriginalFilename", "Laserschweissanlage.exe"
      VALUE "ProductName", "Laserarbeitsplatz"
      VALUE "ProductVersion", "4.3.5"
      VALUE "Comments", ""
   }
}

BLOCK "VarFileInfo"
{
   VALUE "Translation", 0x0407 0x04E4
}
}
Das kompilierte File hat dann aber noch ein paar Daten mehr in der VersionsInfo (mit ResourceHacker ausgelesen):



Delphi-Quellcode:
1 VERSIONINFO
FILEVERSION 4,3,5,407
PRODUCTVERSION 4,3,5,407
FILEOS 0x4
FILETYPE 0x1
{
BLOCK "StringFileInfo"
{
   BLOCK "040704E4"
   {
      VALUE "CompanyName", "Zebra Elektrotechnik*FileVersion"
      VALUE "FileVersion", "4.3.5"
      VALUE "InternalName", "LAP"
      VALUE "LegalCopyright", "Copyright Zebra"
      VALUE "LegalTrademarks", ""
      VALUE "OriginalFilename", "Laserschweissanlage.exe"
      VALUE "ProductName", "Laserarbeitsplatz"
      VALUE "ProductVersion", "4.3.5"
      VALUE "Comments", ""
   }
}

BLOCK "VarFileInfo"
{
   VALUE "Translation", 0x0407 0x04E4
}
}
Komischerweise passiert dies nicht, wenn ich bei Company Name den letzten Bustaben wegmache.

Martin W 4. Mai 2013 19:23

AW: Re: SVN Revision als Buildnummer nutzen in Delphi
 
Zitat:

Zitat von Phoenix (Beitrag 946480)
In diese .rc Datei fügst Du dann das SVN-Keyword ein und *wuppdi* hast Du ein .rc - File mit den richtigen Versionsinformationen. Das einzige Problem ist, dass Du diese .rc-Datei eben vor dem Kompilieren des Projektes in die .dcr (Delphi Compiled Resource) Datei kompilieren musst. Das geht eben ab Delphi 2006 mit den Pre-Build events.

Ich habe nun folgende RC Datei:

Delphi-Quellcode:
1 VERSIONINFO
FILEVERSION 2014,1,1,847
PRODUCTVERSION 2014,1,0,0
FILEOS 0x4
FILETYPE 0x1
{
BLOCK "StringFileInfo"
{
   BLOCK "040904E4"
   {
      VALUE "CompanyName", "Test_UN"
      VALUE "FileDescription", "Test"
      VALUE "FileVersion", "2014.1.1.900"
      VALUE "InternalName", "pBMS_Core"
      VALUE "LegalCopyright", "xxx"
      VALUE "OriginalFilename", "ABC.exe"
      VALUE "ProductName", "Test"
      VALUE "ProductVersion", "2014.1"
   }
}

BLOCK "VarFileInfo"
{
   VALUE "Translation", 0x0409 0x04E4
}
}
Wie kann ich die FileVersion, die Delphi automatisch generiert, damit überschreiben?

Seit einer Stunde ohne Ergebnis... :gruebel:

generic 6. Mai 2013 10:13

AW: SVN Revision als Buildnummer nutzen in Delphi
 
Was ich damals vergessen habe zu erwähnen:
Die Keywords und deren Versionsnummern/Revisionen beziehen sich immer nur auf die entsprechende Datei und nicht auf das "letzten Update" bzw. dessen Revisionsnummer des Checkouts.

Für letzteres kann der CLI-Befehl "svnversion" genutzt werden.
Damit erhält man die Revisionsnummer des Arbeitsverzeichnis.

@Martin:
Für die Datei das Keyword aktiveren. Das geht via SVN-Property.
In der Datei dann an die entsprechende Stelle einfach das Keyword z.B. "$Revision$" einfügen.
Beim Commit wird dieses dann automatisch ersetzt.

http://svnbook.red-bean.com/en/1.7/s....keywords.html

Bitte den Abschnitt "Where's $GlobalRev$?" beachten!


Code:
usage: svnversion [OPTIONS] [WC_PATH [TRAIL_URL]]

  Produce a compact 'version number' for the working copy path
  WC_PATH. TRAIL_URL is the trailing portion of the URL used to
  determine if WC_PATH itself is switched (detection of switches
  within WC_PATH does not rely on TRAIL_URL). The version number
  is written to standard output. For example:

    $ svnversion . /repos/svn/trunk
    4168

  The version number will be a single number if the working
  copy is single revision, unmodified, not switched and with
  an URL that matches the TRAIL_URL argument. If the working
  copy is unusual the version number will be more complex:

   4123:4168     mixed revision working copy
   4168M        modified working copy
   4123S        switched working copy
   4123P        partial working copy, from a sparse checkout
   4123:4168MS  mixed revision, modified, switched working copy

  If WC_PATH is an unversioned path, the program will output
  'Unversioned directory' or 'Unversioned file'. If WC_PATH is
  an added or copied or moved path, the program will output
  'Uncommitted local addition, copy or move'.

  If invoked without arguments WC_PATH will be the current directory.

Valid options:
  -n [--no-newline]       : do not output the trailing newline
  -c [--committed]        : last changed rather than current revisions
  -h [--help]             : display this help
  --version               : show program version information
  -q [--quiet]            : no progress (only errors) to stderr

Martin W 7. Mai 2013 20:01

AW: SVN Revision als Buildnummer nutzen in Delphi
 
Zitat:

Zitat von generic (Beitrag 1214292)
@Martin:
Für die Datei das Keyword aktiveren. Das geht via SVN-Property.
In der Datei dann an die entsprechende Stelle einfach das Keyword z.B. "$Revision$" einfügen.
Beim Commit wird dieses dann automatisch ersetzt.

http://svnbook.red-bean.com/en/1.7/s....keywords.html

Bitte den Abschnitt "Where's $GlobalRev$?" beachten!

Danke für deine Antwort, hab mich aber leider falsch ausgedrückt. Also das rc-File mit der Version bekomme ich erstellt, ich lass dies automatisch mit einem lokal Hook generieren. Die Frage ist aber: Wie bekomm ich Delphi dazu, das RC-File zu nutzen, um daraus die Versionsnummer zu verwenden?

Danke,
Viele Grüße,
Martin

generic 8. Mai 2013 09:23

AW: SVN Revision als Buildnummer nutzen in Delphi
 
Delphi hat die Versionsnummer in der Projektdatei und erzeugt da draus die Resourcen und linkt diese.
Das muss unterbunden werden! Also aus dem Projekt die Option Versionsnummern entfernen.
Ich denke hier war das Problem -> zwei Versionsresourcen in der Kompilierten Anwendung.

Wenn du die RC über die IDE erzeugt hast, dann sollte in der DPR Datei eine Zeile wie folgt sein:
Delphi-Quellcode:
{$R 'version.res' 'version.rc'}
bzw. sollte auch in dem Projektexplorer austauchen.

Martin W 8. Mai 2013 19:36

AW: SVN Revision als Buildnummer nutzen in Delphi
 
Zitat:

Zitat von generic (Beitrag 1214668)
Delphi hat die Versionsnummer in der Projektdatei und erzeugt da draus die Resourcen und linkt diese.
Das muss unterbunden werden! Also aus dem Projekt die Option Versionsnummern entfernen.
Ich denke hier war das Problem -> zwei Versionsresourcen in der Kompilierten Anwendung.

Super, probiere ich gleich aus!

Martin W 8. Mai 2013 19:55

AW: Re: SVN Revision als Buildnummer nutzen in Delphi
 
Danke, hat funktioniert!

Zitat:

Zitat von Daimonion (Beitrag 946487)
Das einzige Problem, was ich derzeit noch habe sind ein paar Hieroglyphen.

So sieht die Quelle aus:

Delphi-Quellcode:
1 VERSIONINFO
FILEVERSION 4,3,5,407
PRODUCTVERSION 4,3,5,407
FILEOS 0x4
FILETYPE 0x1
{
BLOCK "StringFileInfo"
{
   BLOCK "040704E4"
   {
      VALUE "CompanyName", "Zebra Elektrotechnik"
      VALUE "FileVersion", "4.3.5"
      VALUE "InternalName", "LAP"
      VALUE "LegalCopyright", "Copyright Zebra"
      VALUE "LegalTrademarks", ""
      VALUE "OriginalFilename", "Laserschweissanlage.exe"
      VALUE "ProductName", "Laserarbeitsplatz"
      VALUE "ProductVersion", "4.3.5"
      VALUE "Comments", ""
   }
}

BLOCK "VarFileInfo"
{
   VALUE "Translation", 0x0407 0x04E4
}
}
Das kompilierte File hat dann aber noch ein paar Daten mehr in der VersionsInfo (mit ResourceHacker ausgelesen):



Delphi-Quellcode:
1 VERSIONINFO
FILEVERSION 4,3,5,407
PRODUCTVERSION 4,3,5,407
FILEOS 0x4
FILETYPE 0x1
{
BLOCK "StringFileInfo"
{
   BLOCK "040704E4"
   {
      VALUE "CompanyName", "Zebra Elektrotechnik*FileVersion"
      VALUE "FileVersion", "4.3.5"
      VALUE "InternalName", "LAP"
      VALUE "LegalCopyright", "Copyright Zebra"
      VALUE "LegalTrademarks", ""
      VALUE "OriginalFilename", "Laserschweissanlage.exe"
      VALUE "ProductName", "Laserarbeitsplatz"
      VALUE "ProductVersion", "4.3.5"
      VALUE "Comments", ""
   }
}

BLOCK "VarFileInfo"
{
   VALUE "Translation", 0x0407 0x04E4
}
}
Komischerweise passiert dies nicht, wenn ich bei Company Name den letzten Bustaben wegmache.

Ja, die Länge einer jeden Eigenschaft muss, warum auch immmer, durch 2 Teilbar sein, dann geht es. Im Notfall einfach mit einem Leerzeichen auffüllen.

Dank an Dich!

Viele Grüße,
Martin

Union 8. Mai 2013 20:04

AW: SVN Revision als Buildnummer nutzen in Delphi
 
Nein, aber die Strings sollten durch ein Nullbyte abgeschlossen werden, besonders wenn Leerzeichen enthalten sind.
Code:
BLOCK "040704E4"
   {
      VALUE "CompanyName", "Zebra Elektrotechnik*FileVersion\000"
      VALUE "FileVersion", "4.3.5"
      VALUE "InternalName", "LAP"
      VALUE "LegalCopyright", "Copyright Zebra\000"
      VALUE "LegalTrademarks", ""
      VALUE "OriginalFilename", "Laserschweissanlage.exe\000"
      VALUE "ProductName", "Laserarbeitsplatz\000"
      VALUE "ProductVersion", "4.3.5"
      VALUE "Comments", ""
   }

Martin W 8. Mai 2013 20:25

AW: SVN Revision als Buildnummer nutzen in Delphi
 
Zitat:

Zitat von Union (Beitrag 1214762)
Nein, aber die Strings sollten durch ein Nullbyte abgeschlossen werden, besonders wenn Leerzeichen enthalten sind.

Danke für den Hinweis!


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:33 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz