Est-ce une bonne pratique de stocker les runtimes du framework sous contrôle de source?

9

Je sais que de nombreux magasins de logiciels gardent les binaires sous contrôle de source . Cependant, notre boutique était venue pour stocker des frameworks entiers sur le référentiel: DirectX runtime, CUDA, nVidia Optix, peu importe.

On dit qu'il facilite la configuration d'une machine de développement (soi-disant, obtenez la dernière version et commencez à coder). Cependant, il gonfle considérablement le référentiel et le charge avec une histoire non pertinente.

Je n'ai jamais vu un tel modèle d'utilisation. Considérez-vous cela comme une bonne pratique?

[EDIT:] Je n'ai aucun problème avec le contrôle de source des binaires tiers isolés. La question se réfère à des temps d'exécution complets du framework, consistant généralement en plus de 10 binaires. À titre d'exemple extrême, prenez le SDK Windows (que nous ne conservons pas dans le référentiel, Dieu merci, mais je ne vois aucune différence de principe).

Ofek Shilon
la source
1
Vous pouvez créer un script qui télécharge la dernière version ou les exécutions de framework pertinentes, et placer ce script sous contrôle de version.
Basile Starynkevitch du
2
Pourquoi pensez-vous que cela alourdit [le référentiel] avec une histoire non pertinente ? Plus précisément, pourquoi pensez-vous que l'histoire n'est pas pertinente ? Si votre code fait référence à ces frameworks et bibliothèques, il est très utile de savoir quelles versions étaient utilisées lors d'une révision particulière dans le référentiel.
James McNellis
Je suis d'accord sur le ballonnement (surtout si ces temps d'exécution sont partagés entre plusieurs projets) mais je ne comprends pas la partie sur l'histoire non pertinente. Un changement par exemple dans la version d'un runtime que vous utilisez est tout à fait pertinent ...
6502
Ne serait-il pas plus facile de créer des images de la machine du développeur au fur et à mesure des mises à jour?
Ramhound
@Ramhound: c'est la direction exacte que j'essaie de pousser. Je me demandais s'il y avait des inconvénients qui me manquaient.
Ofek Shilon

Réponses:

6

Les binaires ne sont généralement pas bien adaptés au système de contrôle de version car:

  • ils ne bénéficient pas des fonctionnalités de contrôle de version (fusion, diff)
  • ils augmentent la taille du dépôt ...
  • ... ce qui compte car vous ne supprimez pas facilement une version d'un VCS (les VCS sont faits pour garder l'historique), contrairement aux référentiels d'artefacts comme Nexus , qui sont de simples répertoires partagés (faciles à nettoyer: cd+ rm!)
  • ils doivent être référencés dans un VCS comme un texte , une déclaration de chemin + version: vous pouvez conserver l'historique pertinent de cette façon , en enregistrant tout changement de version binaire comme un changement dans ce fichier texte (comme un pom.xml si vous utilisez Nexus par exemple)
VonC
la source
1
Le dernier point est très précieux.
Noufal Ibrahim
Merci! Connaissez-vous un référentiel d'artefacts similaire pour les projets C ++? Encore mieux - peut-être celui qui s'intègre à TFS?
Ofek Shilon
2
@OfekShilon: Nexus peut en théorie stocker tout type d'artefact. Mais pour le stockage et la gestion des dépendances pour .NET / C ++, vous avez également NuGet: nuget.codeplex.com . Exemple pour .Net: lostechies.com/derekgreer/2011/09/20/… . Il devrait également prendre en charge les projets C ++: nuget.codeplex.com/discussions/280649 .
VonC
@OfekShilon Vous pouvez lier TFS à NuGet (par exemple: coolthingoftheday.blogspot.com/2011/08/… , hanselman.com/blog/… ). Voir aussi TFSNuGetter: nugetter.codeplex.com
VonC
6

Je suis d'accord avec la version contrôlant les actifs binaires. Je suis contre la version contrôlant les fichiers générés .

En outre, la configuration de l'environnement est différente du développement. Nous développons principalement en Python et il dispose d'un outil appelé virtualenv qui vous permet de créer un environnement isolé léger (y compris des bibliothèques) pour un projet. Lorsque nous vérifions nos sources, nous avons un script de configuration qui construit ce virtualenv. À l'aide d'un manifeste, cela spécifie quelles versions de bibliothèques sont nécessaires et d'autres choses de ce genre. Rien de tout cela n'est contrôlé par la version. Seul le script de configuration l'est.

Jeter tout le cadre sous votre projet principal encombrera votre histoire et gâchera sérieusement les choses. Cela ne fait pas partie de votre projet et doit être traité différemment.

Noufal Ibrahim
la source
3

C'est généralement une bonne idée de faire la gestion de la configuration avec les versions du framework. Si votre code a besoin d'une version DirectX spécifique, cette version doit être facilement disponible et si vous extrayez une ancienne version de votre logiciel, il devrait être facile de déterminer les dépendances externes dont il dispose.

Ce que je ne pense pas être une bonne idée ici, c'est d'utiliser votre système de contrôle de version typique pour stocker ces binaires. Dans notre entreprise, nous stockons chaque version de frameworks, bibliothèques et outils externes dans une structure de sous-dossiers sur un lecteur réseau. Lorsque nous pensons que cela a du sens, nous avons des fichiers Lisez-moi pour documenter la version de l'outil à laquelle appartient la version du logiciel, ou, si possible, nous avons des scripts pour installer ou utiliser une version spécifique. Seuls ces fichiers et scripts Lisez-moi entrent dans le contrôle de version.

Nous conservons également les anciennes versions des outils et des bibliothèques tant que nous pensons qu'il peut y avoir une chance que nous devons reconstruire et les anciennes versions en fonction de ces outils. De cette façon, cela nous donne la possibilité de supprimer certains des très anciens bibliothèques et outils de notre lecteur réseau lorsqu'ils sont obsolètes (bien sûr, juste au cas où nous aurions des archives sur des supports externes).

Doc Brown
la source
2

Je pense que les binaires devraient être stockés quelque part. Je suggérerais de les stocker en dehors d'un référentiel, surtout s'ils sont volumineux et entraînent de longs délais de vérification. Je ne vais pas voir que c'est une mauvaise pratique, mais ce n'est pas non plus celle que j'ai vue.

Cela peut en fait être une bonne idée si votre organisation a de nombreux projets qui ciblent différentes versions d'exécution. Il garantit que vous disposez du bon binaire d'exécution lorsque vous travaillez sur les bons projets.


la source
J'ai clarifié la question pour y répondre.
Ofek Shilon
1

Personnellement, je considère cela comme une très mauvaise pratique. Je préfère configurer un wiki avec des instructions d'installation et y télécharger les fichiers binaires nécessaires. Ces fichiers ne sont nécessaires que pour les nouveaux développeurs, il n'est pas nécessaire de gonfler les référentiels de tout le monde.

Sergio Tulentsev
la source
1

Il y a une bonne raison pour cela, à savoir que vous avez tout ce dont vous avez besoin dans un seul endroit, sans aucune dépendance externe.

C'est beaucoup plus important que vous ne le pensez. Il garantit essentiellement que vous ne comptez pas sur un artefact sur un serveur fournisseur qui peut disparaître après quelques années, car vous avez tout en interne.

En ce qui concerne le ballonnement du référentiel. Ce n'est un problème que si votre VCS conserve une copie locale complète (git le fait, cvs non) car le clonage et / ou la mise à jour sera lent. En retour, vous aurez des copies sur chaque machine de développement, ce qui peut sauver votre entreprise si votre système de sauvegarde central échoue pour une raison quelconque un jour.

C'est une question de priorité ou de politique. Tant que la décision est délibérée, je serais d'accord avec cela.


la source
2
Si vous stockez votre bibliothèque tierce sur un référentiel d'artefacts comme votre propre serveur Nexus ou NuGet, vous n'aurez pas à craindre la disparition d'un serveur "fournisseur". Donc, par tous les moyens, stockez-les localement. N'utilisez simplement pas de VCS. Ils ne sont pas destinés à conserver ce type de fichier.
VonC
@VonC dépend de votre infrastructure et de votre méthologie de travail. Pour "ne stocker qu'un seul binaire une fois", un VCS peut être aussi bien qu'un référentiel d'artefacts complet. Il permet également de maintenir une infrastructure simple. Je ne préconise pas - le PO a demandé si quelqu'un avait vu un tel modèle d'utilisation.
D'accord. J'ai vu un tel modèle d'utilisation. Et je devais administrer de tels dépôts (Centralize VCS comme SVN ou ClearCase principalement, jamais vu cette utilisation pour DVCS comme Git). Et c'est généralement un gâchis. En regargeant les bibliothèques des fournisseurs, vous ne stockez que rarement un seul binaire une fois. Vous devez gérer les correctifs. Beaucoup d'entre eux. De plus, le stockage n'est pas le seul objectif (s'il l'était, VCS pourrait sans doute être une solution potentielle). La gestion des dépendances l'est. Et c'est ce que Nexus ou NuGet offrent (en plus d'un stockage facile à administrer et à nettoyer).
VonC