Actuellement, mon entreprise a une solution Visual Studio dans un référentiel SVN qui est organisé comme suit:
SolutionFolder (~3.5 GB)
|-> SolutionName.sln
|-> .. Some source code folders... (~250 MB)
|-> ThirdParty (~3 GB)
|-> Tools
| -> Tool1
| -> Tool2
Tool1 et Tool2 sont construits indépendamment (ont leurs propres solutions), mais produisent des exécutables qui sont utilisés dans la build principale. Le dossier ThirdParty contient toutes les dépendances du projet, y compris certains fichiers .lib de plus de 100 Mo précompilés et de grandes bibliothèques comme boost.
Il est pratique de tout avoir dans un seul référentiel SVN pour que (1) le développeur n'ait à effectuer qu'une seule extraction, et (2) nous n'avons pas besoin de garder une trace des versions des dépendances dont nous avons besoin pour chaque version de la build. D'un autre côté, il faut un certain temps pour vérifier ce dépôt.
Quelle serait la meilleure façon de déplacer cette structure de projet vers git? Vraisemblablement, il est préférable d'exclure ThirdParty et éventuellement les outils du référentiel principal, mais nous aimerions garder ThirdParty facilement téléchargeable en une seule étape, et nous l'aimons versionné (et les décalages de version entre le référentiel principal et ThirdParty / Tools seraient mauvais).
À ce stade, je ne suis pas intéressé à préserver l'histoire, juste à trouver comment organiser un tel projet.
Réponses:
Utilisez l'outil approprié pour le travail. Sous Windows, cela signifie
Utiliser NuGet pour les dépendances tierces
De cette façon, vous conservez les dépendances tierces de manière versionnée, mais vous ne surchargez pas votre référentiel avec des éléments inutiles. Les extractions sont beaucoup plus rapides et le projet est organisé comme il se doit. Vous pouvez activer une option dans Visual Studio afin qu'elle télécharge toujours toutes les dépendances automatiquement.
Bien sûr, vous pouvez utiliser une solution qui utilise uniquement git (un autre dépôt, des sous-modules, etc.), mais ce ne sont que des hacks. Le faire de la bonne façon portera ses fruits rapidement et vous laissera un système évolutif.
Modifier après les commentaires: la meilleure façon d'utiliser NuGet est de configurer une source NuGet locale, soit sur un lecteur partagé, soit sur un serveur nuget complet. L'installation ne devrait pas prendre plus de quelques minutes dans les deux cas. De cette façon, vous pouvez garantir que tous les packages dont vous avez besoin sont toujours disponibles, peu importe d'où ils proviennent.
la source
Vous pouvez utiliser des sous-modules pour les outils. De cette façon, vous pouvez les conserver dans un sous-répertoire comme vous le faites maintenant, et utiliser un référentiel séparé pour les versionner. Cela signifie également que vous pouvez cloner (extraire) les outils et les développer séparément, et que d'autres projets pourraient s'appuyer sur ces référentiels - et sur des versions spécifiques et modifiables d'entre eux également.
Vous pouvez également utiliser des sous-modules pour les bibliothèques tierces, mais si possible, je recommanderais d'utiliser un gestionnaire de dépendances pour celles-ci.
la source
Les entités que vous transformez en référentiels git sont nécessairement les entités que vous versionnez et branchez; si
SolutionFolder/Tools/Tool1
correspond à une telle chose, c'est le niveau d'entité. C'est parce que git considère que l'état entier de l'arborescence de répertoires est l'entité versionnable, alors qu'avec svn il est possible (même si ce n'est pas une bonne idée) d'en avoir untrunk
,branches
ettags
n'importe où dans l'arborescence.Les artefacts dérivés ne doivent pas être conservés dans le référentiel, pas plus que les bibliothèques externes. Il existe de meilleures façons de les gérer. (Si vous travaillez avec Java, envisagez d'utiliser un référentiel Maven privé; ils sont relativement faciles à utiliser et s'intègrent bien à beaucoup d'autres choses.)
Si vous êtes habitué à un flux de travail qui contient tout dans un seul référentiel pour faciliter le paiement, pensez à avoir un script qui configure les choses à la place.
la source
ThirdParty
dossier dans le dépôt est tellement pratique, et il est difficile de trouver une bonne alternative.Pour être honnête, je ne changerais rien dans votre configuration. C'est exactement ce que nous faisons maintenant. Je jouais avec la mise en place d'un référentiel git séparé pour gérer la bibliothèque tierce que nous utilisons, mais je ne pense pas que cela pèse sur le coût de la portabilité. Désormais, tout développeur peut simplement commander et commencer sans avoir à effectuer aucune étape de configuration manuelle. Et je n'importe quel serveur / esclave de construction peut construire le projet. À moins que vous n'ayez plusieurs référentiels partageant les outils de tierce partie, je m'en tiendrai à votre configuration actuelle.
J'ai joué avec la configuration des outils tiers dans un référentiel séparé. Ensuite, j'ai eu un simple script batch lu un fichier texte avec une référence sha1 et vérifier la bonne version. Cela me permettrait d'avoir différentes versions tierces pour différents projets. J'ai eu cette idée avec l'outil de construction Facebook Buck. Mais au final, de nombreux développeurs n'aiment pas utiliser les outils de ligne de commande (boutique MS VC ici), j'ai donc abandonné l'idée.
L'une des principales raisons pour lesquelles vous ne devez pas télécharger vos bibliothèques tierces lorsque vous en avez besoin (à l'aide de NuGet) est que si vous devez prendre en charge votre produit pendant une longue période. Dans mon secteur, nous devons parfois fournir des mises à jour pour les anciennes versions qui reposent sur d'anciennes bibliothèques tierces. Nous ne voulons pas passer beaucoup de temps à trier les bibliothèques que nous pouvons mettre à niveau ou non et simplement utiliser les bibliothèques utilisées dans cette version. Imaginez maintenant que vous utilisez NuGet, oups ... la dernière version de la bibliothèque dont vous avez besoin est 3.98 mais vous avez besoin de 2.04 ..... comment expliquer à votre patron que vous devez passer 2 mois pour mettre à niveau l'ancienne version pour pouvoir d'utiliser les dernières bibliothèques quand il s'attendait à un petit changement!
la source