Delphi: comment mettre à jour automatiquement vos applications? [fermé]
j'ai pensé à rouler mon propre code pour permettre à mon application Delphi de se mettre à jour de façon transparente comme je vais aller pour "release often, release early" mentalité de plus. Il existe différentes solutions Delphi (gratuites et payantes) et j'aimerais savoir si vous avez utilisé l'une d'elles ou si vous avez simplement continué avec vos propres solutions dans ce domaine. Tout commentaire sur le sujet de mise à jour automatique est le bienvenu.
10 réponses
il y a des années j'ai écrit un outil simple qui est démarré à la place du vrai programme, vérifie les mises à jour, les charge et les installe (s'il y en a), et commence finalement 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 accès en écriture aux répertoires du programme. Vous pouvez plus simplement mettre à jour votre propre programme dans de tels environnements. C'est pourquoi beaucoup de programmes ces jours-ci viennent avec leur propre outil de mise à jour, qui peut être installé pour fonctionner avec des permissions élevées, de sorte que les mises à jour du programme peuvent être appliquées, même si seuls les utilisateurs standards se connectent au système.
vous devez décider si votre public cible peut être supposé fonctionner sur des comptes d'utilisateur power ou d'administrateur, ou si vous aurez à faire face aux problèmes mentionnés ci-dessus. Avec Vista, les choses sont devenues beaucoup plus difficiles.
avec tous ces problèmes (accès net sur les mandataires, les permissions d'écriture manquantes pour les répertoires d'installation, la nécessité de mettre à jour les fichiers utilisés par le responsable de la mise à jour - pour n'en nommer que quelques-uns-Je n'essaierais pas de coder cela moi-même. Beaucoup mieux pour vérifier si l'une des solutions disponibles ne tous vous en avez besoin.
quel que soit le schéma que vous utilisez, il peut être pratique de savoir que vous pouvez réellement renommer un running .EXE. Ainsi renommer le fichier, Copier dans le 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 la même chose .exe fichier, comme dans citrix/terminal serveur/partage réseau en cas.
j'utilise Synapse routines GetHTTP pour retourner une ressource spécifique, et si elle est trouvée, vérifiez alors avec le système local si une mise à jour est nécessaire. Si c'est le cas, alors la ressource me dit quelle page Aller au lancement et je jette L'URL dans shell exécuter de sorte que les utilisateurs navigateur préféré est affiché.
la plupart du temps, le téléchargement est un programme d'installation créé par InnoSetup qui met à jour le système d'utilisateurs et la base de données à la dernière version. Quand une nouvelle mise à niveau" payée" est nécessaire, j'envoie alors l'utilisateur à un "acheter la mise à jour" le formulaire. Mes ressources web sont des pages ASP, donc je peux rediriger vers une ressource différente basée sur le numéro de version du client.
Pour l'application principale (notre application dispose d'un serveur pièce, et un client morceau) j'ai un chargeur qui va vérifier le serveur pour voir si la version du fichier client sur le serveur est différente de la version sur le client...dans l'affirmative, il demande à l'utilisateur si l'utilisateur veut mettre à jour/rétablir. Nous avons choisi de demandez à l'utilisateur que parfois un bug accidentel pourrait le faire dans le système et l'utilisateur doit dégrader/mettre à niveau seulement les machines spécifiques pour aider à dépanner. Je maintiens un enregistrement de base de données avec la version minimale requise qui est mis à jour via le patch de base de données, donc si une version doit être retirée alors l'enregistrement est mis à jour en conséquence.
j'ai créé ma propre solution basée sur Indy pour le téléchargement et http://sourceforge.net/projects/makeupdate/ pour la correction de fichier. Avant cela, j'ai utilisé et essayé plusieurs outils commerciaux, mais personne ne faisait exactement ce dont j'avais besoin.
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é une bonne raison de changer.
Edit: Lien mis à jour
Normalement, nous utilisons l'outil tiers. Mais dans certaines situations, il n'était pas utilisable et j'ai donc créé une solution propre, qui était assez standard:
- obtenir xml (ou tout autre format) avec les informations de mise à jour.
- si de nouveaux fichiers sont publiés, téléchargez-les et installez-les.
j'utilise TWebUpdate . Il fonctionne bien et a une tonne d'options intéressantes, mais la documentation n'est pas si grande et j'ai rencontré quelques problèmes - c'est pourquoi je télécharge un installateur complet, au lieu de juste les fichiers...
je vais garder un oeil sur cette question, d'ailleurs...
nous avons roulé les nôtres aussi. Son vraiment pas trop difficile.
Notre processus va quelque chose comme:
lorsque l'application principale est lancée, elle vérifie (en utilisant les fonctionnalités de la bibliothèque synapse) si une mise à jour est disponible (en supposant qu'elle soit configurée pour vérifier, bien sûr).
si c'est le cas, il en informe l'utilisateur et askes s'ils veulent mettre à jour.
S'ils le font, il lance une mise à jour .exe, et ferme la principale App.
L'exécutable de mise à jour télécharge les nouveaux fichiers basé sur le contenu d'un fichier texte qu'il récupère, keepiing les fichiers mémoire.
quand la mise à jour est terminée télécharger tout correctement, il sauve alors les fichiers téléchargés sur le disque, la sauvegarde de tous les fichiers qu'il remplace. De cette façon, si le téléchargement est interrompu, vous ne finirez pas avec la moitié des fichiers installés.
enfin, il lance le l'application principale de nouveau, et se referme.
Le truc w/ Vista est que vous devez avoir une entrée dans le programme de mise à jour du manifeste pour le forcer à exécuter avec les droits d'administrateur.
- l'Application se connecte à la ressource http et télécharge le fichier info (fichier texte ini) en mémoire, vérifie le numéro de version de la nouvelle version.
- si une nouvelle version est disponible, l'application télécharge le paquet binaire compressé vers l'emplacement exe.
- lorsque le téléchargement est terminé, il est demandé à l'utilisateur de redémarrer l'application.
- au démarrage, l'application vérifie la présence du paquet de mise à jour
- l'application extrait le contenu du paquet (généralement une nouvelle application, mais des ressources supplémentaires sont également possibles, par exemple des fichiers de langue mis à jour, etc.)- pour chaque fichier, il renomme le fichier courant/ancien par un nom temporaire, puis extrait le nouveau fichier. Si le processus échoue, les fichiers temporaires sont restaurés.
- une fois terminée, l'application exécute le nouvel exe et se ferme.
pas besoin de mise à jour supplémentaire, l'appli peut gérer tout seul.
Pour le paquet compressé nous utilisons notre propre update builder. Le paquet 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'utilisateur Standard de mettre à jour les fichiers d'applications:
configurer votre configuration pour modifier les permissions des programmes répertoire d'installation. De cette façon, les fichiers dans "C:\Program fichiers (x86)\Your Company\You App" peut être modifié sur les comptes avec des DROITS LIMITÉS.
exemple de code pour InnoSetup:
[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 un dossier override. Si des fichiers existent dans ProgramData, utilisez-les, sinon vérifiez dans install dir.
InnoSetup code:
[Files] Source: "C:\Your Project\YourApp.exe"; DestDir: "{commonappdata}\Company Name\App Name\";
comme "stg" et "GuyWithDogs", J'utilise TWebUpdate de TMS. Bien que la documentation ne soit pas si grande, il N'est pas si difficile à apprendre.
avec TWebUpdate, vous avez quelques options quel que soit le protocole que vous utilisez, il peut être fait via HTTP, FTP ou un accès réseau.
pour la couche communication, TWebUpdate utilise WinInet. Dans certaines machines, le cache D'URL de windows / IE peut être en frustation, donc j'ai ajouté une routine pour effacer l'adresse du serveur de mise à jour automatique du cache d'abord à s'assurer que l'information recueillie à partir du serveur est à jour.