Gestion des versions d'une application


Description

J'en avais marre de gérer à la main les numéros de version de mes programmes. Il y a de nombreuses discussions sur les versions des programmes (cf http://www.delphifr.com/infomsg_VERSION-APPLICATION_113551.aspx par exemple), par contre :
- il y a bien une fonction pour lire la version du pgm mais impossible de savoir comment l'écrire lors d'une compilation (ou après)
- la fonction de lecture n'est de toute façon pas universelle (pour les personnes qui passent sous Lazarus, MacOsX, Linux, ...)

Du coup, j'ai fait un petit programme qui se lance en ligne de commande qui permet de lire ou écrire dans un fichier INI. Là je vois les neurones de certains lecteurs de cet article qui s'agitent : mais qu'est-ce qu'il dit? quel est le rapport? ...

Cela permet de:
- gérer le numéro de version dans un fichier Ini et de renommer le programme avec son numéro de version
- d'utiliser le numéro de version par le programme (s'il a besoin de connaître sa version, il lit dans le fichier).

Exemples :
- VarIni c:\toto.ini -gNumVersion (cela permet de récupérer le numéro de version et l'afficher)
- VarIni toto.ini -sNumVersion=0.0.1.4 (permet de dire que le numéro de version est 0.0.1.4)

Comme vous l'avez compris : -g veut dire "get", -s veut dire "set" et NumVersion est le nom de la variable utilisée dans le fichier INI...

Attention, je ré-insiste : le programme est sans prétention (la lecture/écrite dans un fichier INI a déjà été vu de nombreuses fois sur http://www.delphifr.com), mais il peut servir à la communauté (en tout cas il me sert :))

Source / Exemple :


program VarIni;{$APPTYPE CONSOLE}
{______________________________________________________________________________

         Programme sans prétention pour gérer les numéros de version
         Auteur = Eric SALLOU
 ______________________________________________________________________________
}
uses
  SysUtils,
  IniFiles;

const
  kSection = 'Application';

var
  Ini: TIniFile;
  NomFichier, Ligne: string;

{______________________________________________________________________________

                               Help générique
 ______________________________________________________________________________
}
  procedure Erreur;
  begin
    writeln('Ligne de commande:');
    writeln('  VarIni <NomFichierIni> [-g<VariabledansApplication>} | [-s<VariabledansApplication>=<valeur>]');
    writeln('-g : get, -s : set');
    writeln('Exemples:');
    writeln('  VarIni c:\toto.ini -gNumVersion');
    writeln('  VarIni toto.ini -sNumVersion=1.2.3');
  end;

{______________________________________________________________________________

                             Programme principal
 ______________________________________________________________________________
}
begin
  if Paramcount <> 2
  then Erreur
  else
  begin
    NomFichier := ParamStr(1);
    // S'il n'y a pas de chemin on met celui du pgm
    if Pos('\', NomFichier) = 0 then
      NomFichier := ExtractFilePath(ParamStr(0)) + NomFichier;
    // On vérifie que le fichier existe
    if FileExists(NomFichier) then
    begin
      Ini := TIniFile.Create(NomFichier);
      try
        // Vérification qu'il y a au moins 2 paramètres
        if length(ParamStr(2)) > 2 then
        begin
          // regarde si c'est un get ou un set
          if copy(ParamStr(2), 1, 2) = '-g' then
            writeln(Ini.ReadString(kSection, copy(ParamStr(2), 3,
              length(ParamStr(2)) - 2), '???'))
          else if copy(ParamStr(2), 1, 2) = '-s' then
          begin
            // gestion du get
            Ligne := copy(ParamStr(2), 3, length(ParamStr(2)) - 2);
            if Pos('=', Ligne) = 0 then
            begin
              writeln('Pb avec 2ème paramètre (manque "="): ' + ParamStr(2));
              writeln;
              Erreur;
            end
            else
            begin
              // gestion du set
              Ini.WriteString(kSection, copy(Ligne, 1, pos('=', Ligne) - 1),
                copy(Ligne, pos('=', Ligne) + 1, length(Ligne) - pos('=', Ligne)));
              writeln('Mise a jour de la variable OK');
            end;
          end
          else
          begin
            writeln('2ème paramètre inconnu: ' + ParamStr(2));
            writeln;
            Erreur;
          end;
        end
        else
        begin
          writeln('2ème paramètre inconnu: ' + ParamStr(2));
          writeln;
          Erreur;
        end;
      finally
        Ini.Free;
      end;
    end
    else
    begin
      writeln('Fichier ' + NomFichier + ' non trouvé');
      writeln;
      Erreur;
    end;
  end;
end.

Conclusion :


Exemple d'un fichier INI :
[Application]
NumVersion=0.0.0.1

Exemple d'un fichier batch à lancer après la compilation et avant diffusion:
REM GESTION DU NUMERO DE VERSION
@echo Ancien numero de version:
@Varini\VarIni Info.ini -gNumVersion
@set /p NumVer=Numero de version?:
Varini\VarIni Info.ini -sNumVersion=%NumVer%
REM ON FAIT DU MENAGE POUR DELPHI
del VarIni\src\*.~dpr
del VarIni\src\*.~dfm
del VarIni\src\*.~pas
del VarIni\src\*.dcu
del VarIni\src\*.exe
del VarIni\src\*.~ddp
del VarIni\src\*.~dsk
del VarIni\src\*.~dsk
del VarIni\src\*.~txt
del VarIni\src\*.~pa
del VarIni\src\*.~dp
del VarIni\src\*.~ds
REM ON FAIT DU MENAGE POUR LAZARUS
del VarIni\src\*.o
del VarIni\src\*.or
del VarIni\src\*.ppu
del VarIni\src\*.bk1
del VarIni\src\*.bk2
REM ON COMPRESSE LE PGM AVEC UPX
..\..\Outils\upx\upx --force --ultra-brute VarIni\VarIni.exe
REM ON FAIT UNE VERSION ZIP AVEC TZIP
del w32portable\Outil.zip
..\..\Outils\7z\7za a -tzip w32portable\Outil.zip VarIni -mx9
REM ON FAIT UNE VERSION INSTALLABLE (création de w32light\setup.exe)
"\Inno Setup 5\iscc" w32light.iss
REM .... ET LA ON GERE LA VERSION !!!!!!!!!!!!!!!!!
ren w32portable\Outil.zip Outil%NumVer%.zip
ren w32light\setup.exe Outil%NumVer%.exe

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.