Je voudrais savoir s'il est judicieux de diviser le projet sur lequel je travaille en deux référentiels au lieu d'un.
D'après ce que je peux dire:
- Le frontend sera écrit en html + js
- Backend en .net
- Le backend ne dépend pas du frontend et le frontend ne dépend pas du backend
- Le frontend utilisera une api reposante implémentée dans le backend.
- Le frontend peut être hébergé sur n'importe quel serveur http statique.
Pour l'instant, le référentiel a cette structure:
racine:
- l'extrémité avant/*
- backend / *
Je pense que c'est une erreur de garder les deux projets dans le même référentiel. Étant donné que les deux projets n'ont pas de dépendances entre eux, ils doivent appartenir à des référentiels individuels et, si nécessaire, à un référentiel parent contenant des sous-modules.
On m'a dit que c'était inutile et que nous n'en tirerions aucun avantage.
Voici certains de mes arguments:
- Nous avons deux modules qui ne dépendent pas l'un de l'autre.
- A long terme, l'historique des sources des deux projets peut compliquer les choses (essayez de rechercher dans l'histoire quelque chose dans le frontend pendant que vous avez la moitié des validations qui ne sont absolument pas liées au bogue que vous recherchez)
- Conflit et fusion (cela ne devrait pas se produire, mais le fait de demander à quelqu'un de pousser vers le backend forcera les autres développeurs à effectuer des changements de backend pour pousser les changements de frontend.)
- Un développeur peut travailler uniquement sur le backend mais devra toujours tirer le frontend ou l'inverse.
- À long terme, quand il sera temps de se déployer. D'une certaine manière, le frontend pourrait être déployé sur plusieurs serveurs statiques tout en ayant un seul serveur backend. Dans tous les cas, les utilisateurs seront obligés soit de cloner l'intégralité du backend avec, soit de créer un script personnalisé pour envoyer uniquement à tous les serveurs le frontend ou pour supprimer le backend. Plus facile de simplement pousser / tirer uniquement le frontend ou le backend que les deux si un seul est nécessaire.
- Contre-argument (une personne peut travailler sur les deux projets), créer un troisième référentiel avec sous-module et développer avec lui. L'historique est conservé séparément dans les modules individuels et vous pouvez toujours créer des balises où la version du backend / frontend fonctionne vraiment ensemble en synchronisation. Avoir les deux frontend / backend ensemble dans un même dépôt ne signifie pas qu'ils fonctionneront ensemble. C'est juste fusionner les deux histoire en un seul grand repo.
- Avoir frontend / backend comme sous-modules facilitera les choses si vous souhaitez ajouter un pigiste au projet. Dans certains cas, vous ne voulez pas vraiment donner un accès complet à la base de code. Avoir un gros module rendra les choses plus difficiles si vous voulez restreindre ce que les "étrangers" peuvent voir / modifier.
- Introduction et correction de bug, j'ai inséré un nouveau bug dans le frontend. Ensuite, quelqu'un corrige un bug dans le backend. Avec un référentiel, la restauration avant le nouveau bogue entraînera également la restauration du backend, ce qui pourrait rendre sa correction difficile. Je devrais cloner le backend dans un dossier différent pour que le backend fonctionne tout en corrigeant le bogue dans le frontend ... puis en essayant de remettre les choses au point ... Avoir deux référentiels sera indolore car déplacer le HEAD d'un repo a gagné ne change pas l'autre. Et les tests avec différentes versions de backend seront indolores.
Quelqu'un peut-il me donner plus d'arguments pour les convaincre ou au moins me dire pourquoi il est inutile (plus compliqué) de diviser le projet en deux sous-modules. Le projet est nouveau et la base de code date de quelques jours, il n'est donc pas trop tôt pour le réparer.
la source
Certains de vos arguments sont valides et d'autres non.
Ce n'est en fait pas entièrement vrai. Pour pouvoir communiquer, le front-end et le back-end doivent avoir une interface commune (description). Cela en fait un argument faible en faveur des deux dans un référentiel commun. Mais seulement un argument faible car cela ne fait pas beaucoup de différence.
C'est un faux argument. Si vous voulez rechercher comment un bug particulier a été corrigé, vous recherchez dans le bug-tracker pour lequel commit contient le correctif. Et si vous voulez savoir comment un morceau de code particulier a évolué, vous regardez l'historique d'un seul fichier (ou tout au plus d'une poignée). Dans les deux cas, avoir d'autres fichiers, peut-être d'autres modules, dans le référentiel ne devrait en aucun cas compliquer les choses.
C'est un faux argument. Je ne connais aucun VCS (à moitié décent) où vous devez synchroniser l'ensemble du référentiel avant de pouvoir valider / pousser vos modifications. Tout au plus, vous devez synchroniser les dossiers contenant les fichiers modifiés (et souvent uniquement les fichiers eux-mêmes).
Il s'agit du même faux argument que le précédent.
Selon la façon dont les gens envisagent le déploiement, cela peut être un argument valide. Si le déploiement se fera en décompressant un fichier zip / tarbal sur le serveur, alors peu importe la façon dont vos référentiels sont organisés. Si le déploiement se fait en extrayant (une partie) d'un référentiel sur le serveur, il peut être judicieux d'utiliser des référentiels distincts pour les modules qui sont déployés séparément.
C'est un argument valable, mais ce n'est pas si fort.
Ceci est un argument valable.
C'est un argument bidon, car cela signifierait qu'après deux corrections de bogues sur un module, vous ne seriez pas en mesure de rétablir le premier. N'importe quel VCS à moitié décent vous permettra d'annuler à peu près n'importe quel ancien commit (bien que cela signifie souvent que vous effectuez un nouveau commit qui annule ces changements, parfois même pour le sommet de HEAD).
C'est en fait un assez bon argument. Le fait d'avoir deux référentiels facilite le test des scénarios dans lesquels les frontaux et les backends déployés pourraient devenir (légèrement) désynchronisés.
la source
Ce post est un peu ancien mais j'aimerais y contribuer. Bien que votre serveur principal ne connaisse pas vraiment le serveur frontal, le serveur frontal doit avoir des demandes correspondant à l'API du serveur principal. Si vous considérez votre back-end comme une API REST, vous pouvez définir un fichier d'interface tel qu'une interface YAML swagger. Maintenant, il y a vraiment 3 projets, que vous pouvez diviser individuellement en différents dépôts comme bon vous semble:
La définition de l'API est une dépendance dans les deux autres projets, disons que vous utilisiez maven comme outil d'injection de dépendance. Ensuite, cela dépend de la rigueur avec laquelle vous souhaitez effectuer le contrôle de version. Vous pouvez augmenter la version du projet de définition d'API à chaque fois que vous apportez une modification pour vous assurer que les projets sont toujours dans un état compatible mais nécessitent plus de surcharge, ou vous pouvez utiliser quelque chose comme SNAPSHOTS dans maven, et ne faire le versionnement qu'une fois que vous sont satisfaits de l'interface qui est moins lourde mais vous pouvez souvent avoir des incompatibilités. Mais tant que vous appliquerez la définition de l'API dans votre front et votre back-end, vous diviserez bien les projets en différents référentiels.
Ces problèmes concernent davantage la gestion des dépendances. Même si les projets ne sont pas divisés et sont dans le même référentiel, il est assez facile de mettre le site Web dans un état où le front-end et le back-end ne sont pas synchronisés. Vraiment, la seule façon d'arrêter cela est de définir le contrat entre les deux, mais vous voulez le faire d'une manière qui ne couple pas les implémentations du front et du back-end, tout comme vous coderiez à la place à une interface d'une implémentation dans la programmation OO.
Aussi, pour gérer de manière préventive la critique selon laquelle cela crée une surcharge de maintenance de ce fichier d'interface, Swagger par exemple peut même produire des talons de code pour différents langages de programmation et frameworks tels que JAX-RS. Vous pouvez donc produire une interface dans la technologie de votre choix, puis implémenter cette interface. Cela ajoute également une très belle documentation à votre back-end, ce qui facilite la tâche des développeurs front-end.
la source