web-dev-qa-db-fra.com

Maintenance de deux versions logicielles distinctes à partir du même codeBase dans la version de version

Disons que j'écris deux versions différentes du même logiciel/programme/application/script et les stockant sous contrôle de version. La première version est une version gratuite "BASIC", tandis que la seconde est une version "Premium" payante qui prend le codeBase de la version gratuite et l'étend avec quelques fonctionnalités supplémentaires à valeur ajoutée. Tous les nouveaux correctifs, correctifs ou caractéristiques doivent trouver leur chemin dans les deux versions.

Je envisage actuellement d'utiliser master et develop succursales pour la carte principalebase (version gratuite) sur le côté master-premium et develop-premium branches pour la version payante. Lorsqu'un changement est effectué à la version gratuite et fusionné dans la branche master (après des tests en détail sur develop bien sûr), il est copié à la develop-premium branche via le cherry-pick commande pour plus de tests puis fusionné dans master-premium.

Est-ce le meilleur flux de travail pour gérer cette situation? Y a-t-il des problèmes potentiels, des mises en garde ou des pièges à être conscients? Y a-t-il une meilleure stratégie de ramification que ce que j'ai déjà proposé?

Vos remarques sont très appréciées!

P.s. Ceci est pour A PHP stocké dans GIT, mais les réponses doivent s'appliquer à n'importe quelle langue ou VCS.

45
Joseph Leedy

Au lieu d'avoir deux version de code avec une base commune, vous devez concevoir votre application de manière à rendre ces fonctions premium plug-capables et entraînées par la configuration plutôt que des bases de code différentes.

Si vous avez peur d'expédier ces fonctionnalités premium (désactivées par configuration) avec la version de base, vous pouvez toujours supprimer ce code dans une étape de construction/emballage finale et que vous avez deux profils de construction.

Avoir cette conception, vous pouvez également expédier 5 saveurs différentes et devenir très flexible, peut-être même permettre aux tiers de contribuer.

83
OliverS

Je recommande fortement non à l'aide de succursales à cette fin. En général, vous devez envisager des succursales pour des choses qui seront (ou pourraient être) fusionnées à nouveau ensemble (ou pour les succursales de libération, où vous arrêtez de développer l'une des branches). Dans votre cas, vous ne fusionnerez jamais vos versions "de base" et "premium" ensemble, et elles seront toutes deux maintenues indéfiniment, afin que les branches ne soient pas appropriées.

Au lieu de cela, maintenez une version commune du code source et utilisez la compilation conditionnelle (p. Ex. #ifdef En C/C++, vous n'êtes pas sûr de l'équivalent pour PHP) d'inclure ou d'exclure les sections du code qui diffèrent entre "Basic" et "Premium".

On dirait que PHP= peut ne pas avoir une telle caractéristique de compilation conditionnelle intégrée, de sorte que vous puissiez utiliser le prétraiteur C (cpp, vous l'avez probablement déjà déjà) de prétraiter votre source commune code et à partir de cela, produire une version "de base" et une "prime" sans les directives de préprocesseur. Bien sûr, si vous choisissez de le faire, vous devez utiliser make ou quelque chose de similaire pour automatiser le processus d'exécution du préprocesseur .

39
Greg Hewgill

Nous utilisons 2 projets distincts, la base et la prime qui dépend du projet de base. N'utilisez pas de bouffons, ils sont généralement utilisés pour les fonctionnalités.

8
Silviu Burcea

Bien que la plupart des réponses actuelles soient en faveur de la compilation conditionnelle au lieu des succursales, il existe un scénario où il existe un avantage clair pour utiliser des succursales: si vous décidez (maintenant ou ultérieur) décider de rendre le code source de la version de base disponible, y compris tous les Historique de la version mais à l'exclusion de toutes les fonctionnalités premium, vous pouvez le faire avec l'approche des succursales mais pas avec une seule branche et une compilation conditionnelle.

Je conseillerais contre la cueillette des cerises et fusionner à la place Tout passe à partir de la version de base dans la version Premium. Il ne devrait y avoir aucune fonctionnalité ni correction de bugs incluse dans la base mais manquante dans la version Premium. Pour que les choses aussi douloureuses que possible, vous devez vous assurer que la succursale premium modifie les fichiers communs le moins possible. La branche Premium devrait donc contenir principalement des fichiers supplémentaires et peut-être de légères modifications pour créer des instructions. De cette façon, les modifications de la version de base se fusionneront automatiquement sans causer des conflits.

Réponse de Greg a suggéré que vous "considérez des succursales pour des choses qui seront (ou pourraient être) de nouveau ensemble de nouveau plus tard". Avec l'approche, je viens de décrire ceci est le cas, sauf que la branche finale de tous les engagements sera master-premium non master (qui est en fait master-basic).

Les sous-modules seraient bien sûr une option également. Cela dépend de votre processus de construction, mais si vous pouvez effectuer la version premium dans un projet qui utilise la version de base en tant que module, ce serait très bien. Vous pourriez toutefois avoir du mal plus fort si, à un moment donné, vous décidez de choisir des caractéristiques de chérisier à partir de la branche Premium dans la branche de base. Avec des sous-modules, un tel changement serait représenté comme deux commits distincts, alors que les succursales, ce serait un engagement unique à la version de base, et la prochaine fusion dans la version Premium saurait que ces changements sont déjà inclus et n'ont pas être fusionné à nouveau.

3
MvG

Dans "Matériel", cela se fait souvent, ce sont des systèmes vendus pour contrôler le désordre, désolé, je ne me souviens pas de ce qu'ils sont appelés.

Une fois que la machine à laver "moyenne", le code n'est pas modifié autre que pour une solution de bogue très importante, même lorsque le même code est changé dans la machine à laver "basse" qui expédie quelques mois plus tard.

Les clients ne s'attendent pas à obtenir des mises à niveau sur une machine à laver qu'ils ont déjà apportées, un nouveau modèle n'est également pas expédié tous les quelques mois.

La plupart d'entre nous ne vivons pas dans ce monde, alors faites ce que Greg dit à moins que vous n'ayez écrit de logiciels pour les machines à laver.

0
Ian