2009-09-13 6 views
14

Ich hätte gerne eine Variable (oder #define) in C++ - Quelle, die jedes Mal inkrementieren wird, wenn ich Qt Creator verwende, um Quellcode zu erstellen. Kann ich das irgendwie machen, vielleicht ein Qt Creator Plugin oder ähnliches? Wenn es eine Möglichkeit gibt, es zu tun, wenn ich "make" auf der Kommandozeile verwende, um zu bauen?Automatische Erhöhung der Build-Nummer in Qt Creator

Antwort

16

In Ihrer .pro-Datei können Sie eine Variable erstellen, die die Ergebnisse eines Befehlszeilenprogramms enthält. Sie können das dann verwenden, um eine Definition zu erstellen.

BUILDNO = $$(command_to_get_the_build_number) 
DEFINES += BUILD=$${BUILDNO} 

Wenn Sie nur eine einfache Inkrementierung Zahl wollen, können Sie ein ziemlich einfaches Skript verwenden:

#!/bin/bash 
number=`cat build_number` 
let number += 1 
echo "$number" | tee build_number #<-- output and save the number back to file 

ich darauf hingewiesen, dass diese Sie bauen, und auch die Build-Nummer zu erhöhen, würde dazu führen, jedes Mal, erhöhen, wenn Sie versuchen, zu bauen, aber es schlägt fehl. Ein besserer Weg besteht darin, eine Build-Nummer basierend auf dem Status des Codes zu erhalten, und viele Tools zur Versionskontrolle können dafür eine Textzeichenfolge abrufen, wenn nicht eine Zahl.

+1

Ich möchte wirklich auf jedem Build nicht jedes Repository Commit erhöhen. Dies beantwortet meine Frage. – Ross

+0

Ich verwende mein eigenes Schema mit Qt + QMake: http://indiocolifax86.wordpress.com/2010/05/22/a-scheme-for-automatic-build-numbers-in-c-projects/ –

+2

sexy .bat Version :) @echo off set/p var = ver.txt (erstellen nur ver.txt mit 0 drin) – argh

4

Calebs Vorschlag ist großartig, hat aber in meinem Fall nicht "out of the box" funktioniert. Ich habe stattdessen ein paar Fehler und es dauerte ein wenig zu lesen, um sie zu beheben. Die Änderungen sind sehr gering. Ich benutzte Qt 4.7 unter Ubuntu Linux ... Die erste Änderung, wenn man es glauben kann, war im Shell-Skript von let number += 1 zu let number++ ... Normalerweise benutze ich /programmiere Windoze, also kann ich das nicht erklären, aber wenn ich das Skript von einer Befehlszeile (Shell-Eingabeaufforderung) im ursprünglichen Fall liefere, bekomme ich Fehler gemeldet, im geänderten Fall geht alles gut und steigende Zahlen werden zurückgegeben ...

Da es nicht vollständig von Caleb berichtet wird - Ich benutzte build_number.sh als den Namen des Shell-Skripts und machte eine andere Datei mit dem Namen build_number (ohne .sh) und legte nur eine Null hinein, sonst nichts.

Der letzte und widerlichste Fehler wurde behoben, indem BUILDNO = $$(command_to_get_the_build_number) durch BUILDNO = $$system(./build_number.sh) in der Qt-Projektdatei ersetzt wurde. Beachten Sie die system nach $$ und die erforderliche ./ vor dem Dateinamen. Letzteres ist elementar für einen normalen Linux-Benutzer, aber nicht so sehr für einen Windows-Benutzer.

Ich hoffe, dies macht es einfacher für Leute, die neu sind, wie ich. Mehr erfahren Sie in dem Qt Designer-Hilfe Abschnitt lesen, wenn Sie für qmake suchen, einschließlich der Funktionsreferenz, Advanced Nutzung usw.

Oh, ein letztes Wort ... Ich hatte auch DEFINES += -DBUILD=$${BUILDNO} zu DEFINES += BUILD=$${BUILDNO} ändern, so die -D ist Weg. In Ihrem C++ Code würden Sie BUILD verwenden, als ob Sie #define BUILD 1234 oben in Ihrer Datei geschrieben hätten.

+0

Das ist eine gute Anmerkung zum '-D'. Ich werde meine Antwort bearbeiten, um es zu beheben. –

+2

Nach einigen Tests ist jetzt klar, dass diese Lösung nicht perfekt ist, da in vielen Fällen der qmake-Schritt während des Builds nicht ausgeführt wird, da sich die "Konfiguration nicht geändert hat". qmake erstellt das Makefile, das zum Erstellen der Anwendung verwendet wird, und interpretiert auch das, was wir in die * .pro-Datei geschrieben haben, aber nur einmal. Im Makefile finden wir -DBUILD 29 statt BUILD build_number.sh ... Es ist keine Lösung, etwas in das Makefile selbst zu schreiben, da es überschrieben wird, wenn qmake ausgeführt wird. Sie können qmake über das Menü "Designer/Erstellen" ausführen, aber nicht automatisch. Lösung benötigt! –

6

Wie ich zuvor nach einigen Tests geschrieben habe, habe ich festgestellt, dass die ursprüngliche Lösung ein Problem hat, da die Versionsnummer nicht jedes Mal aktualisiert wird, wenn ein neuer Build erstellt wird. In vielen Fällen hatte ich eine Quelldatei bearbeitet, den Build ausgeführt, aber immer noch die gleiche Build-Nummer ... Der Build-Prozess entschied, dass nichts geändert wurde und übersprang den Schritt, der die Build-Nummer aktualisiert hätte. Ich versuchte zuerst einen Weg zu finden, diesen Schritt zu erzwingen, konnte es aber nicht herausfinden. Schließlich entschied ich mich, einen anderen Weg zu gehen. Jetzt benutze ich das Skript, um eine Header-Datei build_number.h zu generieren, die eine #define BUILD mit der aktualisierten Nummer enthält. So ist Calebs Skript nun ein wenig verändert (build_number.sh):

#!/bin/bash 
number=`cat build_number` 
let number++ 
echo "$number" | tee build_number #<-- output and save the number back to file 
echo "#define BUILD ""$number" | tee ../MyProject/build_number.h 

Die fortlaufende Nummer nach wie vor in einer Datei namens build_number gespeichert wird.Ich hätte eine dritte Datei vermeiden können, indem ich die generierte Header-Datei nach der Nummer analysierte, entschied mich aber dagegen. Beachten Sie, dass sich das Skript und der generierte Header im Projektverzeichnis befinden, während sich die Datei build_number im Build-Verzeichnis befindet. Das ist nicht perfekt, aber ich kann damit leben.

Um etwas zusammen zu bringen, gibt es jetzt noch ein paar Dinge zu tun. Zuerst muss die generierte Header-Datei zum Projekt im Qt Designer hinzugefügt werden. Klicken Sie mit der rechten Maustaste auf Header-Files und "Add existing file". Zweitens muss es in der C++ - Datei enthalten sein, wo auf die BUILD define Innenseite zugegriffen wird ... #include "build_number.h" ... und nicht zuletzt müssen einige Zusätze in die Projektdatei (MyProject.pro) eingefügt werden. Beachten Sie, dass ich das Zeug aus Calebs Lösung gelöscht, so dass wir von vorne anfangen hier:

build_nr.commands = ../MyProject/build_number.sh 
build_nr.depends = FORCE 
QMAKE_EXTRA_TARGETS += build_nr 
PRE_TARGETDEPS += build_nr 

Diese Zeilen (Ich habe sie vor dem HEADERS Abschnitt) zwingen, die Ausführung des Skripts, die die letzte Build-Nummer von build_number liest , erhöht es, schreibt es zurück und erzeugt auch eine aktualisierte Version der Datei build_number.h. Da dies ein Teil der Quelle des Projekts ist, wird der neue Wert jedes Mal in den Code eingebunden.

Es gibt eine Sache zu erwähnen - jetzt ist der Bauprozess nie auf die Meinung, dass sich nichts geändert hat. Auch wenn Sie Ihren Code unverändert lassen, wird ein neuer make-Lauf eine neue Versionsnummer generieren und eine neue Binärdatei erstellen. Die alte Lösung hinterließ die Nummer, als sich der Code änderte. Diese neue Lösung erzwingt einen neuen Build, selbst wenn die Quelle unverändert ist, da ich eine Änderung in dieser einen Header-Datei erzwinge. Man hätte etwas dazwischen bevorzugt, aber da der Header nur an einer Stelle enthalten ist, ist die Wiederherstellung sehr schnell und tut nicht viel weh. Aber wenn jemand weiß, wie man das Beste aus beiden Welten herausholt, bitte beraten. Zumindest werde ich jetzt nicht zwei verschiedene Binärdateien mit derselben Versionsnummer haben.

6

Die äquivalente Windows für Jörg Beutel die verbesserte Lösung https://stackoverflow.com/a/5967447/1619432:

.pro:

build_nr.commands = build_inc.bat 
build_nr.depends = FORCE 
QMAKE_EXTRA_TARGETS += build_nr 
PRE_TARGETDEPS += build_nr 

HEADERS += build.h 

build_inc.bat:

@echo off 
set /p var= <build.txt 
set /a var= %var%+1 
echo %var% >build.txt 
echo #define BUILD %var% >build.h 
echo %var% 

Nutzungs

#include "build.h" 
... 
qDebug() << "Build number:" << BUILD; 
+0

Siehe auch http://qtcreator.blogspot.de/2009/10/generating-automatic-version-numbers.html für eine etwas raffiniertere Aufnahme (mit einem benutzerdefinierten Programm, um die Header-Datei zu generieren). – handle

-1

Alle Lösungen, die ich bisher gesehen habe, sind für meinen Geschmack übermäßig verworren. Ich habe eine ziemlich einfache Lösung ausgearbeitet, die plattformübergreifend innerhalb von QtCreator funktioniert.

+0

Dieser Link ist kaputt. – CodeLurker

1

Hier ist eine Lösung für Win7 basierend auf handle's solution. Diese Lösung ermöglicht Windows auch, Ihre Version # anzugeben, wenn Sie mit der rechten Maustaste auf Ihr Ziel klicken und Eigenschaften | auswählen Einzelheiten. Es funktioniert in Win7 und wahrscheinlich in den meisten früheren Versionen.

Ok, machen Sie yer build_inc.bat:

@echo off 
copy /b myapp.rc +,, 
set /p var= <build.txt 
set /a var= %var%+1 
echo %var% >build.txt 
echo #define BUILD %var% >build.h 

und es in yer proj Ordner. (copy /b myapp.rc +,, ist unergründlich Microsoft-eese für "touch" - um den Zeitstempel einer Datei zu aktualisieren.) So weit, so gut - na und? !!

Dieser Teil ist optional, wenn Sie die in die Binärdatei codierte Version nicht benötigen. Erstellen Sie eine RC-Datei, z.:

#include "build.h" 

1 VERSIONINFO 
FILEFLAGS 32 
FILEVERSION 1, 0, BUILD, 0 
PRODUCTVERSION 1, 0, BUILD, 0 
FILEOS 4 
FILETYPE 1 

{ 
    BLOCK "StringFileInfo" 
    { 
     BLOCK "040904B0" 
     { 
      VALUE "FileDescription", "program" 
      VALUE "OriginalFilename", "program.exe" 
      VALUE "CompanyName", "you" 
      VALUE "FileVersion", "Release" 
      VALUE "LegalCopyright", "Copyright (c) 2016, you, fool!" 
      VALUE "ProductName", "Yer proggie" 
      VALUE "ProductVersion", "Release" 
     } 
    } 
    BLOCK "VarFileInfo" 
    { 
     VALUE "Translation", 0x0409, 0x04B0 
    } 
} 

Eine ausgewachsene Version finden Sie hier: Versioning DLLs. BTW: Es wird nicht ohne den VarFileInfo-Block funktionieren. Diese .rc-Datei wird verwendet, wenn Sie mit der rechten Maustaste klicken und diese Informationen in den Eigenschaften | Einzelheiten. Ich habe sowohl eine M $ .rc-Datei für diese Information und das App-Icon als auch andere Ressourcen in Qt Creator unter Resources.

Nicht so optional: Hier ist der Teil, den ich einige Zeit hacken verbracht habe zu finden. Klicken Sie in Qt Creator bei geöffnetem yer-Projekt auf das kleine Computersymbol und stellen Sie es in den Freigabemodus. Klicken Sie auf "Projekte". Klicken Sie auf "Add Build Step", wählen Sie Custom Process Step, und klicken Sie auf das Hutsymbol "^", bis es am Anfang der Liste steht. Nehmen wir an, Sie haben yer .rc, "myapp.rc" genannt. Machen Sie tha Build-Schritt wie folgt lauten:

Command: cmd.exe 
Arguments:/c build_inc.bat 
Working Directory: %{CurrentProject:Path} 

Während eine qmake-basierte Version könnte gut funktionieren, von der Kommandozeile oder Kommandozeilen-Tool von einer IDE genannt, in Qt Creator, die Build-Schritte sind vorzuziehen, glaube ich. Qt Creator führt qmake nicht für jeden Build aus; aber Build-Schritte werden bei jedem Build ausgeführt.

Nun fügen Sie diese yer .proDatei:

RC_FILE += myapp.rc 

Auch MyApp.rc zu yer Proj hinzuzufügen. Es wird unter "Andere Dateien" angezeigt.

Jetzt neu erstellen. Jede Neuerstellung löst eine Berührung der Ressourcendatei aus und führt jedes Mal "rc" aus. Andernfalls wird die Build-Nummer nicht in das binäre Recht codiert. Es läuft schnell für mich. Bei jeder Neuerstellung wird diese Anzahl erhöht. Ich habe nur die Mühe gemacht, sie zum Build "Release" hinzuzufügen; Debug-Builds erhöhen das also nicht. Sie verwenden nur die Nummer des letzten Builds. Sie müssen es einmal in der Freigabe ausführen, um einen Fehler zu vermeiden, glaube ich. Dies funktioniert, ohne dass qmake jedes Mal in Qt Creator separat erneut ausgeführt wird. und gibt dir jedes Mal eine andere Build-Nummer. Es löst keine anderen Neukompilierungen aus. Sie haben den Aufwand, "rc" zu starten und jedes Mal zu verlinken, anstatt nichts zu tun, wenn alles auf dem neuesten Stand ist. aber OTOH, ich mache es nur für Release Builds; du verbindest dich fast immer für einen Build oder Lauf; und wieder ist "rc" schnell.

Optional: Sie können das BUILD-Präprozessorsymbol überallhin mitnehmen, wo immer Sie möchten. #. (Hinweis: Sie können auch yer App-Icon mit so etwas wie hinzufügen:.

IDI_ICON1 ICON DISCARDABLE "Icons/myicon.ico" 

Dies macht es auch im Explorer angezeigt, bevor die Datei ausgeführt wird)

Sie auch „build.h“ hinzufügen Um Ihr Projekt formal in Qt Creator zu erstellen, fügen Sie es in eine Datei ein, in der Sie die Build-Nummer verwenden möchten, und verwenden Sie sie als Zeichenfolge, z mit:

#include <QDebug> 
#include "build.h" 

#define STR_EXPAND(tok) #tok 
#define STR(tok) STR_EXPAND(tok) 

qDebug() << QString("(build ")+STR(BUILD)+")"; 

Ich habe gerade bemerkt einen Nebeneffekt: Wenn Sie es auf diese Weise tun, ist es vor jedem Lauf in Release wieder aufbauen wird. Ich schätze, das ist kein schlechter Preis. Ich denke, ich kann die Laufzeiten immer in das Release-Verzeichnis kopieren und vom Explorer aus ausführen; oder einfach mit dem extra Kompilieren von about.h, dem Lauf von "rc" und dem Link zu jedem Lauf in Release. In diesem Fall könnte ich einfach ein externes Tool erstellen, um es mit einer Tastenkombination auszuführen. Ich bin auf jeden Fall offen für Verbesserungen. Momentan störe ich mich nicht, da nur "about.cpp" kompiliert wird, "rc" ausgeführt wird und die Verknüpfung mit jedem Lauf nicht sehr lange dauert. Trotzdem, Leute: automatische Build-Nummern!

☮!

Bearbeiten: Optional: Um die Buildnummer nur beim Build oder beim Neuaufbau Ihres Projekts zu erhöhen, aber nicht beim Ausführen (auch wenn in Release immer ein Build erstellt wird), wechseln Sie zu Projekte | Erstellen und Ausführen | Führen Sie, klicken Sie auf "Hinzufügen eines Deploy Schritt" und wählen Sie "Custom Prozessschritt":

Command: cmd.exe 
Arguments: /c if exist build.old copy /y build.old build.txt 
Working Directory: %{CurrentProject:Path} 

Dann fügen Sie

copy /y build.txt build.old 

nach @echo in der BAT-Datei aus. Es ist sogar möglich, wenn auch beteiligt, benutzerdefinierte neue Projektvorlagen zu machen: Extending Qt Creator Manual

Edit: Ich habe es jetzt mit einem, nicht zwei, benutzerdefinierte Build-Schritte arbeiten.