Comment mettre à jour les fichiers d’application en utilisant les correctifs?

Je ne suis pas intéressé par une solution de mise à jour automatique, telle que ClickOnce ou le bloc MS Updater. Pour ceux qui ressentent le besoin de demander pourquoi pas: je les utilise déjà et il n’ya rien de mal avec eux, je voudrais juste apprendre des alternatives efficaces.

Je voudrais publier des patches = petites différences qui modifieront les fichiers existants du déploiement avec le plus petit delta possible. Non seulement le code doit être corrigé, mais aussi les fichiers de ressources. La correction du code en cours d’exécution peut être effectuée en conservant deux copies synchronisées distinctes du déploiement (aucune modification à la volée de l’exécutable en cours d’exécution n’est requirejse).

L’application elle-même peut être déployée sur xcopy (pour éviter la correction automatique par MSI des fichiers modifiés ou pour casser des signatures ClickOnce).

Existe-t-il des solutions pour y parvenir?

NOTE: Il y a quelques questions sur SO qui peuvent sembler être des doublons, mais aucune avec une bonne réponse.

Cette question concerne la plate-forme Windows, de préférence .NET.

Jusqu’ici, wyUpdate semble mieux correspondre à ce problème. Toujours intéressé par les alternatives.

Vous ne pourrez pas créer un seul correctif binary pouvant s’appliquer à plusieurs versions du programme. Le scénario suivant ne sera donc pas possible:

org+p1 / \ + p1 +p2 <-- note, p2 is the same patch both places / \ original org+p1+p2 \ / + p2 +p1 <-- ie. the p2 on this line is the same as the one above \ / org+p2 

Vous aurez plutôt ce scénario:

  org v.2 / \ +p1 +p4 <-- note, different patches now / \ org v.1 org v.4 \ / +p2 +p3 \ / org v.3 

Vous devriez facilement voir à quel point cela devient complexe si vous souhaitez autoriser vos utilisateurs à choisir les correctifs qu'ils souhaitent appliquer. Oui, cela peut être fait avec des fichiers texte, après tout, c'est la façon dont la ramification et la fusion fonctionnent avec la plupart des outils de contrôle de source, mais ils fonctionnent car vous pouvez insérer et supprimer des éléments dans les fichiers sans compromettre le rest du fichier. ne fonctionne pas avec un exécutable.

Remarque : Un cas particulier concerne les correctifs qui remplacent les octets, mais n'insère ni ne supprime rien du fichier. Tant que de telles corrections ne se chevauchent pas, il serait possible de choisir celles que vous souhaitez appliquer. Cependant, ces patchs sont très rares.

Comme vous l'avez suggéré dans votre question, vous devriez utiliser une chronologie série, éventuellement avec des correctifs uniques pour les versions existantes. Vous pouvez donc avoir ceci:

  +-- most up to date version | v org v.1 org v.3 org v.4 \ / \ / +p1 +p2 +p3 +p4 \ / \ / org v.2 org v.4 \ +p1.1 \ org v.2 hotfix 1 

En ce qui concerne le code actuel, j'ai une implémentation diff / patch, mais il est probablement loin d'être optimal. Il faut beaucoup de temps pour produire les fichiers de correctifs pour un fichier de taille importante. Les patchs sont assez petits, mais j'ose dire que d'autres algorithmes produiront de meilleurs patchs. Des exemples de tests avec bsdiff et bspatch produisent des correctifs plus petits.

Cependant, le code est ici si vous voulez jouer avec. Il fait partie d'une bibliothèque de classes plus grande et je ne peux pas me souvenir de la quantité (le rest de la bibliothèque) dont vous avez besoin pour comstackr uniquement les classes de patchs binarys, mais tout est là. La classe que vous souhaitez utiliser est la classe Delta2 .