IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Delphi Discussion :

[InnoSetup] Faire une mise à jour simplifiée si on detecte une installation déjà présente


Sujet :

Delphi

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 9
    Points : 12
    Points
    12
    Par défaut [InnoSetup] Faire une mise à jour simplifiée si on detecte une installation déjà présente
    Bonjour à tous,

    Tout d'abord, je tiens à préciser que je suis nouveau sur le forum. J'espère que je poste au bon endroit.

    Je suis actuellement entrain de développer un installeur qui me permet d'installer Microsoft VC++, Apache24, PHP7, bigSQL et certains de ses composants via un script InnoSetup pour une application.

    Pour le moment ça va, j'ai réussi à installer tout ce que je voulais. Il me reste à gérer le cas d'une installation dans le cas où il y en a déjà une.
    Dans ce cas de figure, j'aimerai me contenter de mettre à jour un dossier htdocs présent dans le répertoire Apache24 de mon application. Je ne veux pas m'embêter à tout réinstaller, car à priori si l'utilisateur fait une installation alors qu'elle a déjà été faites, il a déjà bigSQL et donc : postgreSQL, pgadmin3 et bam2 (les composants que j'installe via bigSQL).

    Mon script utilise un dossier SOURCES qui contient tous les éléments dont il a besoin pour réaliser l'installation.

    Le problème, c'est que je ne sais pas du tout comment je vais faire pour ne choisir de mettre à jour que ce dossier : {#SOURCES}\repertoires\Apache24\htdocs et non tout le reste...
    Voici à quoi ressemble ma section [Files] :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    [Files]
    ;--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    ; Définition des fichiers à installer
    ;--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    Source: "{#SOURCES}\repertoires_poste_dev\Apache24\*"; DestDir: "{app}\Apache24"; Flags: ignoreversion recursesubdirs;
    Source: "{#SOURCES}\repertoires_poste_dev\PHP7\*"; DestDir: "{app}\PHP7"; Flags: ignoreversion recursesubdirs;
    Source: "{#SOURCES}\logiciels\vc_redist.x86.exe"; DestDir: "{tmp}"; Flags: deleteafterinstall
    Source: "{#SOURCES}\repertoires_poste_dev\bigsql\*"; DestDir: "{code:GetPGLoc}"; Flags: recursesubdirs;
    Source: "{#SOURCES}\ressources\readMe.txt"; DestDir: "{app}\readMeRep"; Flags: isreadme
    ça c'est ce qui se passe, pour le moment dans une installation normale. Dans le cas d'une mise à jour j'aimerai n'utiliser que la ligne suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Source: "{#SOURCES}\repertoires_poste_dev\Apache24\htdocs\*"; DestDir: "{app}\Apache24\htdocs"; Flags: recursesubdirs;
    Le problème, c'est que, par la suite, j'ai toute une installation des composants de bigSQL qui se fait dans ma méthode [Run] et que j'aimerai bien annulé, la voici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    [Run]
    ;--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    ; Lancement de l''installeur de microsoft VC++
    ;--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    Filename: "{tmp}\vc_redist.x86.exe"; StatusMsg: "{cm:InstallVC}";
    ;--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    ; Installation des composants de bigSQL (bam2, pg96, pgAdmin)
    ;--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    Filename: "{code:GetPGLoc}\pgc.bat"; Parameters: "install pgadmin3"; StatusMsg: {cm:InstallPgAdmin}
    Filename: "{code:GetPGLoc}\pgc.bat"; Parameters: "install bam2"; StatusMsg: {cm:InstallBam2} 
    Filename: "{code:GetPGLoc}\pgc.bat"; Parameters: "install pg96"; StatusMsg: {cm:InstallPg}; AfterInstall: setPassword(); 
    Filename: "{code:GetPGLoc}\pgc.bat"; Parameters: "init pg96"; StatusMsg: {cm:InitPg}; AfterInstall: deletePassword();  
    Filename: "{code:GetPGLoc}\pgc.bat"; Parameters: "start bam2"; StatusMsg: {cm:RunBam2}
    Filename: "{code:GetPGLoc}\pgc.bat"; Parameters: "config pg96 --autostart=on"; BeforeInstall: changePgConf(); StatusMsg: {cm:ConfigPg}
    Filename: "{code:GetPGLoc}\pgc.bat"; Parameters: "start pg96"; StatusMsg: {cm:RunPg}
    ;--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    ; Restauration de la base de données.
    ;--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    ; Roles  
    Filename: "{code:GetPGLoc}\pg96\bin\psql.exe"; Parameters: "-U {#PGUSER} -f ""{#SOURCES}\ressources\restauration_bdd\roles.backup"""; StatusMsg: {cm:RestoUser}
    ; BDD    
    Filename: "{code:GetPGLoc}\pg96\bin\createdb.exe"; Parameters: "-U {#PGUSER} --template template0 --encoding UTF8 --owner fratso {#PGBASE}"; StatusMsg: {cm:CreateDB}
    Filename: "{code:GetPGLoc}\pg96\bin\pg_restore.exe"; Parameters: "-U {#PGUSER} -O --dbname={#PGBASE} ""{#SOURCES}\ressources\restauration_bdd\maResto.backup"""; StatusMsg: {cm:RestoDB}
    ; Rajouts des extensions.
    Filename: "{code:GetPGLoc}\pg96\bin\psql.exe"; Parameters: " -U {#PGUSER} -v ON_ERROR_STOP=1 --single-transaction -q -a -f ""{#SOURCES}\ressources\restauration_bdd\extensions.sql"""; StatusMsg: {cm:CleaningPg}
    ; Réindexation de la base.
    Filename: "{code:GetPGLoc}\pg96\bin\reindexdb.exe"; Parameters: " -U {#PGUSER} --quiet {#PGBASE}"; AfterInstall: cleanPgRepo(); StatusMsg: {cm:ReindexDB}
    ; Redémarrage de pg96.
    Filename: "{code:GetPGLoc}\pgc.bat"; Parameters: "restart pg96"; BeforeInstall: changePgHBA(); StatusMsg: {cm:RestartPg}
    Et donc, j'aimerai annuler ces instructions si je détecte une installation déjà présente. Car mon but est de me contenter de mettre à jour le dossier htdocs dans ce cas là.

    Si quelqu'un a une idée de comment je pourrais procéder, je lui en serait très reconnaissant.

    Surtout si vous avez besoin de plus d'informations, n'hésitez pas à me les demander !

  2. #2
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 834
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 834
    Points : 13 587
    Points
    13 587
    Par défaut
    Il faut conditionner toutes les lignes par check :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    [Files]
    Source: "{#SOURCES}\repertoires_poste_dev\Apache24\*"; DestDir: "{app}\Apache24"; Flags: ignoreversion recursesubdirs; check: not IsUpdate;
    ...
    [Run]
    Filename: "{tmp}\vc_redist.x86.exe"; StatusMsg: "{cm:InstallVC}"; check: not IsUpdate;
    ...
     
    [Code]
    function IsUpdate :boolean;
    begin
      //A toi de faire le contrôle nécessaire, par lecture de la BdR, la présence d'un répertoire, etc.
      //un contrôle de version serait encore mieux en pensant aux mises à jour futures de ces différents éléments.
      Result := FALSE;
    end;

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 9
    Points : 12
    Points
    12
    Par défaut
    Yep, je viens justement de voir ça en cherchant un peu plus loin dans la doc InnoSetup !

    Merci beaucoup pour ta réponse, je n'ai plus qu'à trouver comment je vais faire pour détecter l'installation déjà effectué afin de passer en mode "Mise à jour".

    Merci bien !

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 9
    Points : 12
    Points
    12
    Par défaut
    Désolé de réouvrir ce topic, mais maintenant j'ai un autre problème.

    En fait voilà, je pensais que ça serait simple de trouver comment mettre à jour mon application une fois installée si l'utilisateur relance l'installeur et que l'installeur détecte une installation déjà effectuée.

    Mais après plusieurs recherches depuis hier matin, je dois avouer que je suis un peu perdu...

    En fait voilà ce que j'aimerai faire :

    1ère étape :
    • L'utilisateur lance l'installeur de mon application. Cet installeur installe l'application, ainsi que tous les composants dont elle a besoin (postgreSQL, Apache24, PHP7 etc...)
    • J'ai déjà réussi à faire cette étape.



    2ème étape :
    • L'utilisateur veut mettre à jour l'application. Je lui fournit un installeur contenant la même installation mais avec un dossier Apache24\htdocs plus récent (car c'est ici que je met mes sources à jours), de ce côté là, c'est quelqu'un d'autre qui gère ça à ma place. A priori, le setup sera disponible en téléchargement sur un site web. Je pourrai cependant proposer à l'utilisateur de télécharger un nouveau Setup s'il existe un nouveau setup plus récent sur le site. Mais je ne sais pas comment faire.



    3ème étape :
    • L'utilisateur lance le nouvel installeur. L'installeur détecte une installation déjà effectuée, grâce à une clé de registre déjà présente.
    • L'installeur propose une mise à jour. Mais avant il faut que je compare la version de son dossier htdocs et tous les fichiers qu'il contient avec le mien (présent dans le setup) // C'est ici que je bloque, je ne comprend pas comment faire...
    • L'utilisateur clique sur oui, l'installeur effectue alors la mise à jour. (à partir de là, je passe en mode "mise à jour" et je sais comment gérer avec les 'Check')



    J'ai déjà trouvé un code qui me permet de détecter si une clé de registre est déjà présente, si c'est le cas, l'installeur effectue une désinstallation. Je l'ai modifié pour faire une mise à jour à la place. Mais là encore se pose un problème :

    Si l'utilisateur fait une désinstallation manuelle de l'application, en supprimant les dossiers etc.. La clé de registre reste sur l'ordinateur. Et donc, mon application propose d'effectuer une mise à jour...

    Et je ne vois pas comment résoudre ce problème non plus. Est-il possible de vérifier si la clé de registre pointe vers un répertoire vide ? Si c'est le cas, peut-être que je pourrais me servir de ça pour en déduire que : Si le répertoire pointé par la clé de registre est inexistant, alors c'est que l'application a été désinstallé manuellement, auquel cas je dois me débrouiller pour supprimer la clé de registre et relancer une installation propre par la suite.

    Mais après une question se pose, lors de l'installation j'installe postgreSQL dans un autre répertoire choisie par l'utilisauteur. Si je supprime la clé de registre de mon application, est-ce que ça va aussi désinstaller postgreSQL ?

    Si cela peut vous aider, voici le code que j'ai récupérer puis modifier pour detecter une mise à jour à effectuer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
     
    ; Script generated by the Inno Setup Script Wizard.
    ; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!
     
    #define MyAppPath        "D:\mes_programmes\my_club\output\"
    #define MyAppName       "My Club"
    #define MyAppNameUnder  "my_club"
    #define MyVersion       GetFileVersion(MyAppPath + MyAppNameUnder + ".vmp.exe")
    #define MyAppId         "{9DB4F7B7-8FF3-4913-8E71-68FB775D9D7C}"
     
    ;Contient les fichiers .exe d'installation.
    #define SOURCES "C:\Users\IEUser\Desktop\SOURCES"
     
    [Setup]
    ;--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    ; Définition des paramètres de l'application
    ;--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    AppName={#MyAppName}
    AppVersion={#MyAppName}
    AppVerName={#MyAppName} - {#MyVersion}
    DefaultDirName={#MyAppPath}\{#MyAppName}
    DisableProgramGroupPage=yes
    VersionInfoDescription=Progiciel de gestion intégrée (PGI)
    LicenseFile={#SOURCES}\ressources\licence.txt
    InfoBeforeFile={#SOURCES}\ressources\avant_instal.txt
    InfoAfterFile={#SOURCES}\ressources\apres_instal.txt
     
    ; NOTE: The value of AppId uniquely identifies this application.
    ; Do not use the same AppId value in installers for other applications.
    ; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
    AppId={{#MyAppId}
     
    ; On affiche toujours le choix du répertoire d'installation.
    DisableDirPage=no
    AlwaysShowDirOnReadyPage=yes
     
    ; A utiliser pour une mise à jour d'un poste qui contient déjà postgreSQL
    UsePreviousAppDir=no
    OutputDir=C:\Users\IEUser\Desktop
    OutputBaseFilename= {#MyAppName} installer
    Compression=lzma
    SolidCompression=yes
    PrivilegesRequired=admin
    ChangesEnvironment=yes
     
    [Languages]
    Name: "en"; MessagesFile: "compiler:Default.isl"
     
    [CustomMessages]
    en.installDetect = {#MyAppName} is already installed on your computer. Do you want to try an update ?
     
    [Files]
    Source: "{#SOURCES}\ressources\readMe.txt"; DestDir: "{app}\readMeRep"; Flags: isreadme; Check: not IsUpgrade();
     
    ;; la section code, j'ai viré le titre de la section car ça merdait avec l'affichage du poste
    var
      upgradeMod : Boolean;
    function IsUpgrade: Boolean;
    begin
      Result := upgradeMod;
    end;
     
    function InitializeSetup: Boolean;
    var
      V: Integer;
      iResultCode: Integer;
      sUnInstallString: string;
    begin
      upgradeMod := False;
      Result := True;
      // Si la clé de registre de notre programme existe, alors on est en mise à jour.
      if RegValueExists(HKEY_LOCAL_MACHINE,'Software\Microsoft\Windows\CurrentVersion\Uninstall\{9DB4F7B7-8FF3-4913-8E71-68FB775D9D7C}_is1', 'UninstallString') then  //Your App GUID/ID
      begin
        V := MsgBox(ExpandConstant('{cm:installDetect}'), mbInformation, MB_YESNO); //Custom Message if App installed
        if V = IDYES then
        begin
          // On lance l'installation en mode mise à jour.
          upgradeMod := True;
          Result := True;
        end
        else
          // On quitte l'application sinon.
          Result := False;
          Exit;
      end;
    end;
    Je suis même pas sûr de bien comprendre ce code...

    InnoSetup c'est tout nouveau pour moi, c'est la première fois que je l'utilise, soyez clément.

    Si quelqu'un pourrait m'expliquer le fonctionnement des clés de registre pour InnoSetup, je ne suis pas contre ! J'ai rien trouvé là dessus et je pense que c'est quelque chose que j'ai vraiment besoin de comprendre si je veux m'en sortir...

  5. #5
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 834
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 834
    Points : 13 587
    Points
    13 587
    Par défaut
    Citation Envoyé par fratso Voir le message
    Mais avant il faut que je compare la version de son dossier htdocs et tous les fichiers qu'il contient avec le mien (présent dans le setup) // C'est ici que je bloque, je ne comprend pas comment faire...
    Tu peux ajouter le flag comparetimestamp sur les fichiers qui ne contiennent pas d'information de version. Mais même sans lui, est-ce problématique si Inno Setup ré-extrait ces fichiers ?

    Pour le reste, je pense que tu te poses trop de questions. Inno Setup ne va extraire que ce qui est plus récent (version ou timestamp ci-dessus) ou inexistant. Un mode update n'est pas très intéressant puisque ça consiste à refaire ce que IS fait déjà...

    Ce qui m'ennuyerait plus est que tu me forces à installer Apache ou PostGRE s'ils sont déjà présents sur mon système

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 9
    Points : 12
    Points
    12
    Par défaut
    J'ai avancé sur mon script, j'ai finalement réussi à faire la mise à jour. En fait je ne comprenais pas comment fonctionnait le script car je cherchais la clé de registre dans HKLM\SOftware\... Alors que sous un windows 64bits pour un installeur 32bits la clé est écrite sous HKLM\Software\WOW6432Node\... Je me prend trop la tête, tu as raison je me pose trop de questions. ^^"

    Citation Envoyé par Andnotor Voir le message
    Tu peux ajouter le flag comparetimestamp sur les fichiers qui ne contiennent pas d'information de version. Mais même sans lui, est-ce problématique si Inno Setup ré-extrait ces fichiers ?
    Non ce n'est pas problématique. En fait, j'aimerai juste vérifier si les fichiers sont déjà à jour pour justement éviter de faire la mise à jour. Je préfère prévennir l'utilisateur que sa version est déjà à jour avec cette version de l'installeur, plutôt que de lui demander s'il veut tenter de mettre à jour ses fichiers.

    Citation Envoyé par Andnotor Voir le message
    Ce qui m'ennuyerait plus est que tu me forces à installer Apache ou PostGRE s'ils sont déjà présents sur mon système
    Pour le moment c'est ce que je fais. Je procède par étape car je n'ai jamais utiliser InnoSetup avant. Mais je vais sûrement attaquer cette partie. Il faudra que je trouve un moyen de le demander à l'utilisateur, de lui demander les chemins dans lesquelles il veut que je fasse les installations, etc.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 03/02/2014, 09h06
  2. Réponses: 13
    Dernier message: 29/07/2009, 06h01
  3. [Requête/SQL]Faire une mise à jour sur une sélection
    Par Xe2007 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 16/04/2007, 18h03
  4. Réponses: 1
    Dernier message: 08/02/2007, 11h11
  5. Réponses: 11
    Dernier message: 02/06/2006, 12h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo