Versions- und Build-Nummer

  • Versions- und Build-Nummer

    Hi.

    Ich wuerde gerne in meinen Builds, im About-Screen, zu der Versionnummer auch die Buildnummer schreiben.

    Frage: was wird normalerweise als Build-Nummer genommen.
    Hier koennte ich die Revisionnummer (HEAD) von meinem SVN repository nehmen.

    Was nehmt ihr da und wie lasse ich es automatisch beim Build setzen?


    Manfred
  • RE: Versions- und Build-Nummer

    ich hab mir n kleines Programm geschrieben, dass mir aus dem aktuellen datum eine build-nummer generiert. das lasse ich dann per shell-script beim compilieren ausführen und gut ist. Die Methode funktioniert ungefähr so:

    Quellcode

    1. Datum -> 18.05.2006 -> 06 05 18 -> 060518 -> in hex konvertieren -> EC66


    Ggf füge ich (z.B. bei beta-builds) noch einen counter an, der jeden tag gelöscht wird. Eine fertige Build-nummer könnte dann so aussehen: EC66.042

    Wenn interesse besteht kann ich den Code und Binary auch posten, sind nur 40 Zeilen...

    Max
  • Bitte, wie gewünscht:

    Quellcode

    1. int main (int argc, const char * argv[])
    2. {
    3. NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    4. unsigned i;
    5. if (argc > 1)
    6. {
    7. NSCalendarDate *date = [NSCalendarDate date];
    8. NSMutableDictionary *dict;
    9. NSString *build, *path;
    10. BOOL detailed;
    11. detailed = [[NSString stringWithFormat: @"%s", argv[1]] isEqual: @"-d"];
    12. build = [[NSString stringWithFormat: @"%0x", ([date yearOfCommonEra] - 2000)*10000 + [date monthOfYear]*100 + [date dayOfMonth]] uppercaseString];
    13. path = [NSString stringWithFormat: @"%s", argv[1 + detailed]];
    14. dict = [NSMutableDictionary dictionaryWithContentsOfFile: path];
    15. if (![build isEqual: [dict objectForKey: @"CFBundleVersion"]] || detailed)
    16. {
    17. int subnumber, dot;
    18. subnumber = 1;
    19. dot = [[dict objectForKey: @"CFBundleVersion"] rangeOfString: @"."].location;
    20. if (dot != NSNotFound)
    21. subnumber = [[[dict objectForKey: @"CFBundleVersion"] substringFromIndex: dot + 1] intValue] + 1;
    22. if (dot == NSNotFound || ![build isEqual: [[dict objectForKey: @"CFBundleVersion"] substringToIndex: dot]])
    23. subnumber = 1;
    24. if (detailed)
    25. build = [build stringByAppendingFormat: @".%03d", subnumber];
    26. [dict setObject:build forKey:@"CFBundleVersion"];
    27. [dict writeToFile:path atomically:YES];
    28. }
    29. }
    30. else
    31. {
    32. printf("Bad path!");
    33. }
    34. [pool release];
    35. return 0;
    36. }
    Alles anzeigen


    Nicht über den code meckern, das war n quick&dirty write und weil er funktioniert hab ich ihn nie geändert...

    Max
  • Original von oddysseey
    lol, genau so war das gemeint :D statt BUILDNUMBER schreibst du deine buildnummer rein :D dachte, das wäre klar... sorry für das Missverständnis!


    Achso. Na da ich wirklich was falsch verstanden.
    Ich hab da halt eine Versionsnummer drin stehen und wollte zusaetzlich eine dynamische, je nach $irgendwas, eine Build-Nummer in eckigen Klammern.

    Manfred
  • RE: Versions- und Build-Nummer

    Original von Neum
    Ich wuerde einfach mal auf dieses Posting hinweisen: osxentwicklerforum.de/thread.p…ilightuser=1033#post27632
    Beim Einsatz von SVN ist das eigentlich schon ziemlich optimal.


    Cool, mit Perl haette ich mir auch was ueberlegt.
    Ueber Camelbones oder PerlObjCBridge kann man sogar direkt die PropertyList manipulieren vor dem Build.

    Es wuerde wahrscheinlich auch mit den svn keyword properties funktionieren. Mal sehen.


    Gruesse,
    Manfred
  • Original von oddysseey
    könntest du nur ganz kurz erklären, wie's funktioniert? kapier's nicht ganz!

    lg
    oddy


    Ich versuche mich mal.
    Beim aufruf des Programmes muß man einen Pfad angeben wo die
    Datei info.plist ist. Dort wird dann die erzeugte Buildnummer in
    Hexadezimaler schreibweise eingetragen unter CFBundleVersion.
    Wenn kein argument übergeben wird. Erscheint bad path.

    cu
    Josef
  • RE: Versions- und Build-Nummer

    Ich poste auch mal meine Loesung:

    Da bei den Commits die Revisionsnummer auch mal schnelle vierstellig werden kann und die Versionsnummer dann die Form nn.n.nxnnn verliert, wollte ich die Buildnummer separat, unter eine Versionsnummer schreiben.

    Das Feld in Info.plist CFBundleVersion faellt dann dafuer auch flach. Aber kein Problem, man kann sich hier ja auch ein eigenes Feld erstellen. Dort schreibe ich die von svn info bekommene Revisionsnummer ein.

    Quellcode

    1. use strict;
    2. use Camelbones qw(:Foundation);
    3. # extract Revision of HEAD of Repository
    4. my $revStr = `svn info -r HEAD | grep "^Revision:"`;
    5. print "revStr = $revStr\n";
    6. # get number only
    7. $revStr =~ /\b(\d+)$/;
    8. my $buildNumber = $1;
    9. print "r[$buildNumber]\n";
    10. # create mutable dictionary of Info.plist
    11. my $infoPlistDict = NSMutableDictionary->dictionaryWithContentsOfFile('./Info.plist');
    12. # change MBBuildNumber
    13. $infoPlistDict->setObject_forKey(NSString->stringWithString($buildNumber),'MBBuildNumber');
    14. # write back dictionary
    15. $infoPlistDict->writeToFile_atomically('./Info.plist',1);
    Alles anzeigen

    Fuer den perl Script muss die Info.plist Datei im aktuellen Pfad liegen.


    Manfred
  • Original von M.A.X
    Bitte, wie gewünscht:

    Quellcode

    1. int main (int argc, const char * argv[])
    2. {
    3. NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    4. ....
    5. return 0;
    6. }


    Nicht über den code meckern, das war n quick&dirty write und weil er funktioniert hab ich ihn nie geändert...

    Max


    Und was genau muss ich mit diesem Code machen. Kompilieren? Habe leider keine Ahnung.