web-dev-qa-db-fra.com

Binaires dans le contrôle de la source

Lorsque vous développez des appareils embarqués et d'autres mondes impairs, il est très probable que votre processus de construction inclue plusieurs binaires propriétaires, en utilisant des versions très spécifiques. Donc, la question est, faites-elles partie de votre contrôle source? Mes bureaux vont de la règle de "vérifier à partir du contrôle de la source incluent tout ce dont vous avez besoin pour compiler le code" et cela a conduit à des arguments sérieux.

Les principaux arguments que je vois contre ceci sont bloquants le contrôle de la source DB, l'absence de fichiers binaires de diffusion ( voir les questions antérieures sur le sujet . Cela s'oppose à la possibilité de vérifier, de construire, de savoir que vous avez l'environnement précis le développeur précédent destiné et sans chasser les fichiers appropriés (avec des versions spécifiques sans moins!)

31
Daniel Goldberg

L'idée de contrôle de la version (Misnomère: Source Control) est de vous permettre de rétablir l'historique, de récupérer l'effet des modifications, de voir les modifications et de la raison. Il s'agit d'une gamme d'exigences, dont certaines ont besoin de trucs binaires, dont certains ne le font pas.

Exemple: pour les travaux de micrologiciel embarqués, vous aurez normalement une boîte à outils complète: soit un compilateur propriétaire qui coûte beaucoup d'argent, soit une version de GCC. Afin d'obtenir l'exécutable d'expédition, vous avez besoin de la trappe d'outils ainsi que de la source.

Vérification des cuillères à outils dans le contrôle de la version est une douleur, les utilitaires diff sont horribles (du tout), mais il n'y a pas d'alternative. Si vous souhaitez que la boîte à outils préservée pour le gars qui vienne regarder votre code dans 5 ans, vous devez trouver ce qu'il fait, alors vous n'avez pas le choix: vous devez également avoir la trappe d'outils sous la version.

J'ai trouvé au fil des ans que la méthode la plus simple de procéder est de créer une image Zip ou ISO du CD d'installation et de vérifier cela. Le commentaire CheckIn doit être le numéro de version des fabricants spécifiques de la machine à outils. Si GCC ou similaire, alors faites tout ce que vous utilisez dans un grand zip et faites de même.

Le cas le plus extrême que j'ai fait est Windows XP _ incorporé où la "Toolchain" est une machine à exécuter Windows XP VM, qui incluait (retour ensuite) SQL Server et une pile de fichiers de configuration avec des centaines et des centaines de fichiers de patch. Installation du lot entier et l'obtenir à jour utilisé pour prendre environ 2-3 jours. La préservation de celle de la postérité signifiait vérifier l'ensemble de l'ensemble VM dans la version de la version. Voyant que le disque virtuel a été composé d'environ 6 x 2 Go d'images, il est passé très bien. On dirait sur le dessus, mais cela rendait la vie très facile pour la personne qui est venue après moi et devait l'utiliser - 5 ans plus tard.

Résumé: Le contrôle de la version est un outil. Utilisez-le pour être efficace, ne vous remettez pas de choses comme la signification des mots et n'appelez pas cela "contrôle de la source" parce que c'est plus grand que cela.

28
quickly_now

Neal Ford soutient-il dans le programmeur productif que vous avez devrait Gardez les binaires dans le contrôle de la source:

Pourquoi garder les binaires? Les projets dépendent aujourd'hui d'une bande d'outils et de bibliothèques externes. Disons que vous utilisez l'un des cadres de journalisation populaires (comme log4J ou log4net). Si vous ne construisez pas les fichiers binaires pour cette bibliothèque de journalisation dans votre processus de construction, vous devez le conserver dans la version de version. qui vous permet de continuer Construire votre logiciel, même si le cadre ou la bibliothèque en question disparaît (ou plus probablement, introduit un changement de rupture dans une nouvelle version). Gardez toujours l'univers entier nécessaire pour créer votre logiciel dans la version de version (moins le système d'exploitation, et même cela est possible avec la virtualisation; voir "Utiliser la virtualisation, "Plus tard dans ce chapitre). Vous pouvez optimiser les binaires de conservation en les conservant dans la version de version et sur un lecteur réseau partagé. De cette façon, vous n'avez pas à traiter avec eux toutes les heures, mais ils sont sauvés au cas où vous auriez besoin de reconstruire quelque chose d'un an plus tard. Vous ne savez jamais si vous devrez reconstruire quelque chose. Vous le construisez jusqu'à ce qu'il fonctionne, puis oubliez-le. C'est la panique induisant pour réaliser que vous devez reconstruire quelque chose de deux ans et que vous n'avez pas toutes les parties.

Je ne pourrais pas être plus d'accord; Bien que cela subverse sans soutien la VCS pour une tâche, elle n'a pas été conçue pour (garder les binaires), je pense que les avantages l'emportent sur les inconvénients potentiels. Mais, comme l'a noté l'auteur plus tard, il est parfois nécessaire que les fichiers binaires en VCS ne soient pas une solution pratique, d'autres options doivent donc être considérées comme les garder sur un lecteur réseau mappé.

Si les fichiers binaires ne sont pas trop gros, je les garderais certainement dans VCS. Cela semble être encore plus vrai dans votre cas, car les fichiers binaires sont probablement petits, et Vous travaillez avec des versions très spécifiques. Ils pourraient également être difficiles à trouver, grâce à une variété de raisons (les auteurs éteignent leur site Web ou la version dont vous avez besoin n'est plus répertoriée pour le téléchargement). Bien que peu probable, vous ne savez jamais ce qui se passera dans quelques années.

J'aimerais lire ce livre il y a quelques années, lorsque je travaillais sur un jeu en utilisant une bibliothèque graphique (qui était le fichier DLL); J'ai interrompu le développement pendant un moment et quand je voulais continuer, je ne pouvais plus trouver la DLL à nouveau parce que le projet est mort.

18
Mihai Rotaru

En principe, j'apprécie le camp de "Vérifiez tout ce dont vous avez besoin pour bâtir le contrôle de la source", mais la gestion de la dépendance a évolué un peu au cours des dernières années, avec des outils tels que Maven, Ivy et Nuget.

En outre, dans la pratique, je trouve une vérification des fichiers binaires pour créer un certain nombre d'effets secondaires désagréables. Git/Mercurial ne sont pas vraiment à l'écoute, par exemple, et Subversion et Perforce peuvent vous conduire des écrous lors de la fusion des branches contenant des binaires.

Avec une solution de gestion de dépendances, vous spécifiez dans un fichier contrôlé par source dans votre projet quels noms de paquets et les versions de votre projet dépendent. Presque tous les outils de gestion de dépendance vous permettent de créer un référentiel privé de vos dépendances, à la suite d'une sorte de convention de version et de dénomination; Lorsque vous effectuez une construction, l'outil de gestion de dépendance résoudra toutes vos dépendances open source et propriétaire d'une liste de sources approuvées, puis les compléter dans votre cache locale. La prochaine fois que vous construirez avec les mêmes dépendances de la version, tout est déjà là et cela va beaucoup plus vite.

Votre référentiel privé peut ensuite être sauvegardé avec des outils de sauvegarde conventionnels du système de fichiers.

Cela évite les ralentissements que j'ai vus lorsqu'une tonne de binaires est tiré de l'arborescence source et empêche votre référentiel d'avoir beaucoup de fichiers difficiles à diff. Il n'y a qu'un seul endroit pour une dépendance donnée, par nom et numéro de version, il n'y a donc pas de conflits de fusion à traiter, et la mise en cache du système de fichiers local signifie que vous n'avez pas à gérer le coût d'évaluation si votre copie locale a changé quand Vous tirez des mises à jour.

9
JasonTrue

Le contrôle de la source est pour les sources. Les sources sont ce que vous êtes incapable de construire d'autres choses. Certains fichiers qui se qualifient comme des sources sont des binaires.

Mon VCS a beaucoup de binaires qui y ont vérifié, mais chacun est l'unité de libération de certains produits que je n'ai pas écrites et ne maintenez pas. Cela pourrait être quelque chose comme GNU CCRTP, qui est libéré comme une citation compressée. Cette tarbère est ma source et elle est vérifiée avec n'importe quelle infrastructure que j'ai besoin de le transformer en produit fini (une Makefile et une spécification RPM dans mon cas) dans une seule étape automatisée. Lorsqu'il y a une nouvelle version de CCRTP, je traite la nouvelle citaterie comme modifiée Source: elle passe dans une copie à commande, est construite, testée et validée à Le VCS. J'ai fait la même chose avec des produits commerciaux qui n'envoient pas avec la source (compilateurs, bibliothèques, etc.) et cela fonctionne de la même manière. Au lieu de décompresser-configurer-compile-package, il suffit de déballer. Le logiciel qui fait la nuit ne se connaît pas ou ne se souciait pas tant qu'il peut exécuter make et obtenir des produits finis.

La plupart des VCSS ont des caractéristiques qui rendent la source lisible par l'homme plus facile à gérer et plus efficacement à stocker, mais de dire qu'ils ne sont pas adaptés aux fichiers binaires, ce n'est pas vraiment vrai si les binaires sont revenus sur une seule fois. Comment une VCS traite des fichiers binaires interne dépend entièrement de savoir si ses auteurs pensaient que la tentative de stockage des différences ne valait que la peine. Personnellement, je pense que le stockage des copies complètes d'une distribution CCRTP à 600k a POP est plus que composé de la possibilité de marquer une version de celle-ci avec toutes mes autres sources.

8
Blrfl

Cela me rappelle le problème des "bocaux dans le référentiel" qu'il y a quelque temps Java avait. Les gens bâtiment Java applications ont été utilisés pour pousser leurs dépendances (fichiers binaires de jar ) dans des référentiels. Tout le monde était heureux avec cela, parce que nous aurions "un clic", le système de construction et l'espace disque est bon marché, alors qui s'en soucie. Puis est venu maven et vous pourriez vous débarrasser de tout ce cruft binaire et avec le cache local uniquement Le référentiel maintient toujours BULLE-PRO (BULLE). Vous avez toujours un système de construction "un clic", mais le contrôle de la source n'a pas à mélanger autour de fichiers binaires qui n'ont aucun sens là-bas.

Donc, oui, vous pouvez obtenir des fichiers binaires hors du contrôle de la source, mais cela vous obligera à modifier le système de construction, de les obtenir au moment de la construction. Sans logiciels dédiés (comme Maven), cela pourrait être beaucoup d'effort pour simplement les sortir.

4
Jacek Prucia

Votre contrôle source contient les sources à ce que vous faites. Si un blob binaire donné peut être reconstruit à partir des sources, ce n'est pas une source et ne doit pas aller dans le référentiel de code source. Seuls les blobs non recréables devraient dans le contrôle de la source.

Vous avez généralement n autre dépôt Dossier réseau des blobs binaires que vous avez construits à travers le temps des sources. Ceux-ci peuvent être déployés sur des clients ou utilisés dans des projets (au lieu de tout construire de zéro à chaque fois).

Alors, mettez-le si c'est une source. Ne pas sinon.

3
user1249

L'objectif est de pouvoir obtenir le code le plus récent et de le construire sans avoir à installer/configurer rien (donc, une construction "simple clic").

Dans de nombreux endroits, j'ai été, cela signifie vérifier dans les binaires des dépendances. Dans d'autres, cela signifie que les scripts de construction téléchargent et obtiennent automatiquement les dépendances.

Voir - ce blog post par Derek Greer sur le sujet.

2
Oded

Je travaille dans un projet avec deux étapes de construction différentes

  • le "programme principal de la construction" n'a besoin que de quelques fichiers binaires, comparés aux milliers de fichiers texte de code source, de sorte que les fichiers binaires sont vérifiés dans le référentiel. Cela fonctionne bien.

  • la construction d'installateurs nécessite beaucoup de composants tiers (certains d'entre eux sont simplement copiés sur le CD d'installation, comme le lecteur Adobe). Nous ne mettons pas ceux dans le référentiel. Au lieu de cela, ces composants résident sur un lecteur réseau (même des versions plus anciennes d'entre eux) et les scripts de construction les copient au bon endroit. Bien sûr, avoir des constructions reproductibles, quiconque doit faire attention à ne modifier aucun dossier dans lequel les composants tiers sont stockés.

Les deux stratégies fonctionnent bien et remplissent le "Vérification du contrôle de la source incluent tout ce dont vous avez besoin pour compiler le code" exigence.

2
Doc Brown

Vous devez garder tout ce dont vous aurez besoin pour reconstruire des versions spécifiques du produit à un moment donné à un moment donné.

Cependant, vous n'avez pas besoin de tout garder dans le contrôle de la source.

Une entreprise a gardé un rack de serveur congelé (car le système d'exploitation ne s'est élevé que sur ce matériel spécifique, et la boîte à outils ne s'est élevée que sur ce système d'exploitation et la source dépendait de cette boîte à outils). Impossible de vérifier cela dans le contrôle de la source.

Si vous avez besoin de scinder les exigences en matière de construction, vous avez le problème de la comptabilité de la conservation de deux systèmes de contrôle de version Sync'd. par exemple. la boîte matérielle dans ce placard ou le VM ou binaires dans ce volume de sauvegarde conservé, accédez à cette révision de code source SVN, etc. C'est Messier qui utilise un système de contrôle source unique, mais solvable .

1
hotpaw2

C'est très chaos d'enregistrer binaire à SCM dans mon esprit. J'avais géré un projet très complexe, qui compte beaucoup de dépendances aux bibliothèques tiers. Les principes que nous avons adoptés:

  1. Tout code source est géré avec SCM
  2. Toutes les dépendances sont gérées avec Ivy, qui a une grande intégration Eclipse.

Cela fonctionne assez bien. Nous avons un fichier de configuration sur la version de chaque bibliothèque externe que le code source peut être compilé. Ce fichier de configuration est vérifié dans SCM. Il évolue de sorte que le code source évolue. En appliquant cette approche, nous pouvons exactement reproduire une construction sans gâcher la version des bibliothèques externes.

0
James Gan

Personnellement, philosophiquement, je suis enclin à laisser vérifier la source de contrôle pointeurs aux grands fichiers binaires (les petites ressources binaires sont correctes) et non le contenu du fichier. Ce pointeur contiendrait un hachage du contenu du fichier binaire.

Le fichier binaire lui-même ne serait pas géré par le contrôle de la source. Il serait stocké dans une sorte de bibliothèque où il peut être récupéré à l'aide du pointeur, ou du hachage spécifiquement.

Git LFS et GIT Annexe Faites cela, mais ils essaient également de gérer dans une certaine mesure la gestion des fichiers binaires, je ne veux pas qu'ils le fassent. Je veux que Git stocke des checksums seulement et de me dire si mes fichiers binaires ont changé ou non - mais je ne veux pas qu'il essaie de les gérer et de les stocker. Je veux faire cela moi-même.

Je pense que GIT peut gérer des fichiers binaires de petite et moyenne taille, mais je ne suis pas sûr que c'est le bon outil de gestion de gros fichiers binaires.

0
Rolf