J'ai pensé à rouler mon propre code pour permettre à mon application Delphi de se mettre à jour de manière transparente, car je vais en outre adopter la mentalité "libérer souvent, publier tôt". Il existe différentes solutions Delphi (à la fois gratuites et payantes) et j'aimerais vous demander si vous avez utilisé l'une d'entre elles ou si vous avez simplement continué avec vos propres solutions dans ce domaine. Tous les commentaires sur le sujet de la mise à jour automatique sont les bienvenus.
Il y a des années, j'ai écrit un outil simple qui démarre à la place du programme réel, vérifie les mises à jour, les charge et les installe (le cas échéant), et démarre enfin l'application réelle.
Il y a cependant des problèmes avec cette approche si votre programme fonctionne dans un environnement correctement administré, où les utilisateurs n'ont normalement pas d'accès en écriture aux répertoires du programme. Vous ne pouvez plus simplement mettre à jour votre propre programme dans de tels environnements. C'est pourquoi de nombreux programmes de nos jours sont livrés avec leur propre outil de mise à jour, qui peut être installé pour s'exécuter avec des autorisations élevées, de sorte que les mises à jour du programme puissent être appliquées même si seuls les utilisateurs standard se connectent au système.
Vous devez décider si votre public cible peut être supposé fonctionner sur des comptes d'utilisateur ou d'administrateur avec pouvoir, ou si vous devrez faire face aux problèmes mentionnés ci-dessus. Avec Vista, les choses sont déjà beaucoup plus difficiles.
Avec tous ces problèmes (accès au réseau via des proxys, autorisations d'écriture manquantes pour les répertoires d'installation, nécessité de mettre à jour les fichiers que le programme de mise à jour utilise lui-même - pour n'en nommer que quelques-uns), je n'essaierais pas de coder cela moi-même. Il est préférable de vérifier si l'une des solutions disponibles fait tout ce dont vous avez besoin.
Quel que soit le schéma que vous utilisez, il peut être utile de savoir que vous pouvez en fait renommer un fichier .exe en cours d'exécution. Alors renommez le fichier, copiez dans un nouveau fichier fonctionne bien. Et la prochaine fois que quelqu'un lancera le programme, il lancera une nouvelle version. Ceci est bien sûr très pratique dans un environnement où de nombreux utilisateurs exécutent le même fichier .exe, comme dans les cas de partage citrix/serveur terminal/réseau.
J'utilise les routines Synapse GetHTTP pour renvoyer une ressource spécifique, et si elle est trouvée, vérifiez par rapport au système local pour voir si une mise à jour est nécessaire. Si tel est le cas, la ressource m'indique la page à lancer et je lance l'URL dans Shell pour que le navigateur préféré des utilisateurs s'affiche.
La plupart du temps, le téléchargement est un programme d'installation créé par InnoSetup qui met à jour le système et la base de données des utilisateurs avec la dernière version. Lorsqu'une nouvelle mise à jour "payante" est nécessaire, j'envoie alors l'utilisateur à un formulaire de "mise à niveau d'achat". Mes ressources Web sont ASP pages, donc je peux rediriger vers une ressource différente en fonction du numéro de version du client.
Pour l'application principale (notre application a une partie serveur, et une partie client) j'ai un chargeur qui vérifiera le serveur pour voir si la version du fichier client sur le serveur est différente de la version sur le client ... si ainsi, il invite l'utilisateur si l'utilisateur veut mettre à jour/revenir en arrière. Nous avons choisi d'inviter l'utilisateur car parfois un bogue accidentel peut pénétrer dans le système et l'utilisateur doit rétrograder/mettre à niveau uniquement des machines spécifiques pour aider à résoudre les problèmes. Je maintiens un enregistrement de base de données avec la version minimale requise qui est mise à jour via le correctif de base de données, donc si une version doit être retirée, l'enregistrement est mis à jour en conséquence.
J'utilise TmxWebUpdate . C'est gratuit, simple et vous donne un bon contrôle sur le processus. En fait, je possède TMS Component Pack avec TWebUpdate mais je n'ai jamais vraiment trouvé de bonne raison de changer.
Edit: Lien mis à jour
J'ai également créé ma propre solution basée sur Indy pour le téléchargement et http://sourceforge.net/projects/makeupdate/ pour la correction de fichiers. Avant cela, j'ai utilisé et essayé plusieurs outils commerciaux, mais personne ne faisait exactement ce dont j'avais besoin.
Nous avons également roulé le nôtre. Ce n'est vraiment pas trop difficile.
Notre processus va quelque chose comme:
Lorsque l'application principale est lancée, elle vérifie (à l'aide des fonctions de la bibliothèque synapse) si une mise à jour est disponible (en supposant qu'elle est configurée pour vérifier, bien sûr).
Si tel est le cas, il en informe l'utilisateur et lui demande s'il souhaite mettre à jour.
S'ils le font, il lance un programme de mise à jour .exe et ferme l'application principale.
L'exe de mise à jour télécharge les nouveaux fichiers en fonction du contenu d'un fichier texte qu'il récupère, en conservant les fichiers en mémoire.
Lorsque le programme de mise à jour a terminé de tout télécharger correctement, il enregistre les fichiers téléchargés sur le disque, en sauvegardant tous les fichiers qu'il remplace. De cette façon, si le téléchargement est interrompu, vous ne vous retrouvez pas avec la moitié des fichiers installés.
Enfin, il lance à nouveau l'application principale et se ferme.
L'astuce avec Vista est que vous devez avoir une entrée dans le manifeste du programme de mise à jour pour le forcer à s'exécuter avec les droits d'administrateur.
Normalement, nous utilisons l'outil tiers. Mais dans certaines situations, il n'était pas utilisable, j'ai donc créé une propre solution, ce qui était assez standard:
Nous utilisons notre propre solution qui suit ces étapes:
Aucun programme de mise à jour supplémentaire nécessaire, l'exe de l'application peut tout gérer par lui-même.
Pour le package compressé, nous utilisons notre propre générateur de mise à jour. Le package contient un index de fichiers avec un hachage de fichier, un dossier de destination (chemin relatif vers l'exe principal) et les fichiers compressés. Pendant la mise à jour, nous comparons le hachage stocké avec le fichier extrait pour détecter les fichiers coruptés.
Avec Vista, je vois deux solutions pour permettre aux comptes d'utilisateurs standard de mettre à jour les fichiers d'applications:
Configurez votre installation pour modifier les autorisations du répertoire d'installation des programmes. De cette façon, les fichiers dans "C:\Program Files (x86)\Your Company\You App" peuvent être modifiés sur les comptes avec des droits limités.
Un exemple de code pour InnoSetup serait:
[Dirs]
Name: "{app}"; Permissions: users-modify
Installez les fichiers que vous prévoyez de mettre à jour dans le dossier ProgramData au lieu du répertoire défini par l'utilisateur et utilisez ce répertoire comme dossier de remplacement. Si des fichiers existent dans ProgramData, utilisez-les, sinon archivez le répertoire d'installation.
Code InnoSetup:
[Files]
Source: "C:\Your Project\YourApp.exe"; DestDir: "{commonappdata}\Company Name\App Name\";
J'utilise TWebUpdate . Cela fonctionne bien et a une tonne d'options intéressantes, mais la documentation n'est pas très bonne et j'ai rencontré quelques problèmes - c'est pourquoi je télécharge un programme d'installation complet, au lieu de seulement les fichiers ...
Je vais garder un œil sur cette question, d'ailleurs ...
Identique à "stg" et "GuyWithDogs", j'utilise TWebUpdate de TMS. Bien que la documentation ne soit pas si bonne, ce n'est pas si difficile à apprendre.
Avec TWebUpdate, vous avez quelques options quel que soit le protocole que vous utilisez, cela pourrait être fait via HTTP, FTP ou accès réseau.
Pour la couche de communication, TWebUpdate utilise WinInet. Sur certaines machines, le cache d'URL windows/IE) peut être frustrant, j'ai donc ajouté une routine pour effacer d'abord l'adresse du serveur de mise à jour automatique du cache afin de garantir que les informations collectées sur le serveur sont à jour.