it-swarm-fr.com

Comment garder vos bibliothèques de tiers à jour?

Disons que j'ai un projet qui dépend de 10 bibliothèques et dans le coffre de mon projet, je suis libre d'utiliser toutes les versions de ces bibliothèques. Donc, je commence par les versions les plus récentes. Ensuite, chacune de ces bibliothèques reçoit une mise à jour une fois par mois (en moyenne). Maintenant, garder mon tronc complètement à jour nécessiterait une mise à jour d'une référence de bibliothèque tous les trois jours.

C'est évidemment trop. Même si la version 1.2.3 est généralement un remplacement de la version 1.2.2, vous n'avez jamais savoir sans test. Les tests unitaires ne suffisent pas; Si c'est un moteur DB/fichier, vous devez vous assurer qu'il fonctionne correctement avec des fichiers créés avec des versions plus anciennes et peut-être vice versa. Si cela a quelque chose à voir avec GUI, vous devez tout inspecter. Etc.

Comment gérez-vous cela? Quelques approches possibles:

  • Si ce n'est pas cassé, ne le répare pas. Restez avec votre version actuelle de la bibliothèque tant que Vous Ne remarquez rien de mal avec celui-ci lorsqu'il est utilisé dans votre application, peu importe la fréquence de la bibliothèque Le vendeur publie des mises à jour. Les petits changements incrémentiels ne sont que des déchets.
  • Mise à jour fréquemment afin de continuer à changer de petit. Étant donné que vous devrez mettre à jour une journée dans tous les cas, il vaut mieux mettre à jour afin que vous remarquiez tout problème tôt quand ils sont faciles à réparer, à la place. de sauter sur plusieurs versions et de laisser des problèmes potentiels à accumuler.
  • quelque chose entre les deux. Y a-t-il une tache sucrée?
28
Joonas Pulakka

Je suis choqué - et effectivement consterné - au nombre de réponses ici disant "Ne mettez pas à jour à moins que vous ne l'iez". Je l'ai fait, et bien que ce soit plus facile à court terme, ça brûle comme l'enfer à long terme. Des mises à jour plus fréquentes et plus faciles sont beaucoup plus faciles à gérer que les gros occasionnelles, et vous bénéficiez d'une nouvelle fonctionnalité, de corrections de bugs, et ainsi de suite.

Je n'ai pas acheté cette idée que les modifications de la bibliothèque sont en quelque sorte plus difficiles à tester que les changements de code. C'est la même chose - vous passez une modification du codeBase et vous devez le valider avant de vous engager, et plus profondément avant de libérer. Mais vous devez déjà avoir des processus pour le faire, car vous faites des changements de code!

Si vous travaillez dans des itérations, de deux à quatre semaines de longueur, je suggérerais de faire une mise à jour des bibliothèques une fois par tâche d'itération, à faire dès que possible après le début, lorsque les choses sont un peu plus détendues que juste avant une itération Date limite et le projet a plus de capacité à absorber le changement. Obtenez quelqu'un (ou une paire si vous faites une programmation en paires) pour vous asseoir, consultez les bibliothèques de mise à jour et essayez de vous apporter une reconstruction et un test. Budget d'une demi-journée à une journée à chaque itération, peut-être. Si les choses fonctionnent, enregistrez les changements (je suppose que vous gardez des bibliothèques dans le contrôle de la source, comme nous le faisons; je ne sais pas comment vous propagerez le changement de manière contrôlée, sinon). Cela sera évidemment beaucoup plus facile si vous avez des tests automatisés que si le test est entièrement manuel.

Maintenant, la question est de savoir ce que vous faites si une mise à jour brise les choses - Passez-vous du temps à la résoudre, ou de le laisser sortir? Je suggérerais d'appuyer sur ce dernier; Si cela peut être corrigé dans une heure, faites-le, mais si une mise à jour va prendre des travaux importants à intégrer, puis la soulever comme sa propre tâche de développement, à estimer, à la priorité et programmée comme tout autre. Les chances sont que si cela entraîne une solution ou une amélioration très cruciale, la priorité sera faible, et vous ne vous en tirerez jamais. Mais vous ne savez jamais, au moment où la prochaine journée de mise à jour d'itération itération roule, le problème pourrait se fixer; Même si non, au moins maintenant, vous savez qu'il y a un barrage routier sur le chemin de mise à jour, et cela ne vous attrapera pas par surprise.

Si vous ne faites pas d'itérations de cette longueur, je créerais une sorte de calendrier autonome pour les mises à jour - pas plus que mensuellement. Y a-t-il un autre rythme de projet que vous pourriez lier, comme une revue de statut mensuel, ou une réunion du conseil d'architecture? Payday? Pizza Night? Pleine lune? Quoi qu'il en soit, vous devez trouver quelque chose beaucoup plus court qu'un cycle de libération traditionnel, car essayez de tout mettre à jour, tous les 6-18 mois vont être douloureux et démoralisants.

Inutile de dire que si vous faites des branches de stabilisation avant les versions, vous n'appliqueriez pas cette politique. Là, vous ne mettriez que mettre à jour les bibliothèques pour obtenir des corrections critiques.

25
Tom Anderson

J'évalue.

  • Tout d'abord, je cherche des insectes que nous avons soulevés contre cette bibliothèque et que vous voyez s'ils ont été corrigés.
  • Deuxièmement, je recherche des autres corrections de bugs dans la libère que nous pourrions bénéficier (peut-être quelque chose qui est un cas d'angle possible).
  • Troisièmement, je cherche des améliorations dans la LIB/API, puis enquêter sur l'impact de la modification de notre code pour utiliser cela et le compromis Benfit. J'ai trop souvent dans le passé Upgrade Libs sans utiliser leurs nouvelles fonctionnalités, idiot vraiment!

Je pèse ensuite tout cela contre rester avec la libération existante.

Toujours Test - Espérons que vos tests de l'unité/d'intégration garantissent qu'aucune régression majeure ne se produit.

10
Martijn Verburg

Le problème majeur avec les bibliothèques tiers, est que vous devez réessayer votre demande lorsque vous les mettez à jour, avant de pouvoir aller en production. Donc, à moins que vous ayez un bogue signalé, qui nécessitent une mise à jour d'une bibliothèque, vous ne les touchez pas avant d'avoir le temps de faire un cycle d'assurance qualité complet.

Ceci est généralement fait lors de la publication d'une nouvelle version.

Je suggérerais toutefois que vous ayez une suite de test en place pour une construction continue qui vous permet de mettre à jour les bibliothèques de la branche de développement et de le faire automatiquement. Cela vous assurera de découvrir tôt quand il se casse. Vous pouvez donc déposer des bugReports au projet.

7
user1249

Je penserais à mettre à jour toutes les bibliothèques d'un projet juste avant ou après une libération. Cela pourrait toutefois sortir de la main si vous comptez sur plus de 10 ou 15 bibliothèques, auquel cas une sorte de mécanisme de vérification de la mise à jour vous aiderait grandement. L'avantage de cela est que vous avez un temps dédié à tester vos bibliothèques et que vous pourrez régler les problèmes d'une seule passe. Vous n'avez pas non plus besoin de garder constamment une trace des mises à jour de chaque bibliothèque, vous venez de vérifier un certain jour pour toutes les mises à jour.

Je vais également accompagner tout type de fonctionnalité de mise à jour automatique dans une branche de développement. Il serait frustrant si au beau milieu de moi travaillant sur quelque chose que le projet s'est cassé, car une bibliothèque automatique s'est mise à jour, ou si j'avais tout à coup les avertissements d'amortissement pour utiliser une API qui vient d'être remplacée par autre chose.

2
TheLQ

Vous devez demander, que voulez-vous vraiment sortir de la mise à jour? La plupart des correctifs de sécurité sont en réalité des correctifs triviaux, sous forme de fixation:

  • Désactivé par une des erreurs où le code arbitraire peut être copié dans un espace inutilisé dans un tampon
  • Les pointeurs pendants, ou autre chose qui déclenchent un comportement déterministe non défini mais (plutôt)
  • Bugs qui permettent une sorte de DOS
  • Des bugs qui rendent accidentellement la snooping de données privées faciles
  • Bludutres mathématiques
  • Maintenants touchant des choses qu'ils ne devraient pas (Bug de Debian SSL, quelqu'un?)

Si vous regardez au-dessus de la plupart des CVE au cours des cinq dernières années, les patchs qui les réparent sont généralement assez triviaux, si vous utilisez des bibliothèques ouvertes, que vous espérez que vous êtes.

Ensuite, vous avez des corrections de bugs, que vous voulez probablement, mais vous l'avez peut-être déjà réparé vous-même. Si ce n'est pas cassé, ne le réparez pas.

Enfin, vous avez de nouvelles fonctionnalités .. et peut-être des caractéristiques obsolètes. Vous devez examiner ces notes de publication et diffèrent attentivement. Pouvez-vous les utiliser, même s'ils cassent une API que beaucoup d'autres choses dépendent de? Si oui, il est temps de chirurgie. Si non, Cherry choisissez ce que vous voulez et passez à autre chose.

Certains peuvent être en désaccord avec moi, mais je refuse d'utiliser une bibliothèque sans code source.

2
Tim Post

Cela varie selon les bibliothèques, ce qu'elles sont utilisées, à quel point ils sont envahissants dans votre code, le coût (en termes de temps et d'argent) d'effectuer la mise à niveau, etc.

Idéalement, vous aurez toujours le dernier tout le temps, mais si la nouvelle version n'est pas compatible avec l'arrière-plan, qu'est-ce que alors? Vous devrez peut-être suspendre cette mise à jour pour une version future jusqu'à ce que vous puissiez gérer soigneusement le changement. Il pourrait y avoir un changement subtil du comportement (tel que "Vous devez maintenant définir la propriété X avant d'appeler la méthode Y ou si vous obtenez une fuite de mémoire lente") qui est difficile à vérifier lors de tests.

D'autre part, la nouvelle version pourrait avoir des corrections de sécurité sérieuses, vous devez donc en tenir compte également.

Version courte: prenez-la au cas par cas.

2
JohnL

Subversion Externals

Ce qui est génial de cette fonctionnalité est que vous pouvez spécifier la révision souhaitée.

Veuillez noter que les mises à jour seront plus lentes si vous avez de nombreux extérieurs.

1
user2567

Si votre logiciel est critique de sécurité, vous devez mettre à jour le plus tôt possible, aucune excuse. Vous ne voulez pas un petit bug dans une bibliothèque graphique pour rendre votre programme complet vulnérable.

Sinon, lorsque la lib est mature, c'est "si ce n'est pas cassé, ne le répare pas." pour moi. Tôt ou tard, j'ai peut-être besoin d'une caractéristique d'une version ultérieure et n'a pas d'autre choix que de mettre à jour, mais jusqu'à ce que l'effort est difficile à justifier. D'autre part, lorsque je travaille avec une liberme ou un cadre relativement nouveau, comme Grails ou ExtJS, je reste à jour avec la dernière version car ces produits ne se sentent pas encore matures, la mise à jour est donc susceptible de me sauver de courir dans l'un de ces bugs, la version ultérieure corrigée.

1
user281377

Je met actuellement en place quelque chose comme ça:

  • 1 Mercurial repo pour chaque extension de ma demande
  • une prise en pension Mercurial qui recueillent des versions spécifiques de plusieurs bibliothèques 3ème partie
  • un SVN repo pour les ressources graphiques/travaux (mais pourrait changer à autre chose)
  • une prise en pension Mercurial pour mon application, qui utilise la fonction pour utiliser la version spécifique du Mercurial du 3e repo Pary, et quelques-unes des extensions de base

Maintenant, quand je dois travailler sur une extension qui ne sont pas " de base " (implicitement inclus comme subrepo dans le dépôt de la demande), je clone obtenir simplement le repo dans les extensions dossier et laissez-CMake générer des projets et des solutions pour l'ensemble de l'application.

De cette façon, je peux:

  • changer les 3e parties dans un clone, vérifiez que cela fonctionne avec l'application, pousser dans le 3ème repo Pary, puis mettre à jour la version subrepo du repo demande à la nouvelle version 3ème partie repo
  • travail sur les extensions indépendamment, tout togeter ou tout simplement choisir une spécifique
  • ne pas avoir à se soucier d'avoir à des projets de liaison ensemble, cela se fait par Cmake juste en ayant les projets subrepos numérisés avec l'ensemble repo d'application.

Ne pas encore beaucoup d'expérience avec cette organisation, mais je pense que c'est très utile.

1
Klaim

J'utilise Nuget pour garder mes bibliothèques de ma tierce partie à jour.

Quand un ami, un collègue ou un blog vous avertit que l'une de mes DLL 3ème partie est obsolète, Nuget facilite la mise à jour.

1
Jim G.