24 votes

Comment avez-vous gérer plusieurs versions d'un même logiciel pour chaque client?

J'ai le code source qui est de 95%, le même pour tous les clients. Certains clients demandent quelque chose de spécifique, cependant. Comment puis-je gérer cela, est-il possible avec VisualSVN/Subversion?

Mise à jour:

Quelques détails au sujet de l'application, c'est un web ASP.NET MVC avec NHibernate.

L'application dispose de plusieurs projets : la partie web, les pensions de partie (où nous utilisons NHibernate pour accéder à la base de données) et un projet de service.

Le projet de service utilise les pensions de projet et le projet de service est le projet avec les règles d'affaires.

11voto

ChrisF Points 74295

Je pense à deux approches qui pourraient travailler.

La première consiste en une ramification le code pour chaque client. Toute modification que vous apportez dans la ligne principale peut ensuite être intégré dans le client spécifique de la branche lorsque cela est nécessaire. De même, si quelque chose dans le produit de base est fixé dans une branche, il peut être fusionnée dans la ligne principale pour la suite de la propagation de l'autre des clients branches. Même si cela peut sembler la meilleure approche, il peut être difficile de maintenir et de conserver la trace de la branche a qui édite aurez semé.

La deuxième, et peut-être la meilleure approche, implique la refactorisation de votre code afin que le client code spécifique d'une assemblée unique - un par client. C'est ensuite configuré, peut-être en utilisant l'injection de dépendance, lorsque le produit est installé. De cette façon, vous n'avez qu'une ligne de code et pas de fusion entre les branches. Bien qu'il repose sur le client code spécifique d'être facilement séparé.

5voto

Mitch Wheat Points 169614

Placer le client code spécifique dans des projets séparés/assemblées. Quelque chose comme le modèle de stratégie ou de plugins peut être le chemin à parcourir.

Les autres, moins attrayant, (OMI) serait de créer des branches séparées pour chaque client, mais cela peut rapidement devenir difficile à maintenir.

5voto

Ando Points 2897

L'approche que nous avons retenue est:

  • Insérez les crochets à l'intérieur de l'application permettant le comportement par défaut à être personnalisés (par exemple, quand une Save action est appelée la première chose qui se passe à l'intérieur est un appel à l' OnSaveHandler).
  • Le gestionnaire par défaut ne fait rien, elle retourne "continueWithNormalExecution". Tous les gestionnaires sont dans un autre module de l'application d'origine (montage différent), appelons - BehaviourModule
  • Sur le client en fonction des demandes de modification de la présente BehaviourModule en remplaçant la valeur par défaut de "ne rien faire pour le comportement'. Le code de retour de cette modification gestionnaire peut être: ContinueNormalExecution, SkipNormalExecution, TerminateExecution, etc ...
  • Dans d'autres cas, nous insérez les crochets basée sur des interfaces. Dans l' BehaviourModule nous aurons plus de gestionnaires de mise en œuvre de cette interface, par exemple, DoStuffInterface, l' BehaviourModule est analysée au moment du chargement à l'aide de la réflexion et de tous les gestionnaires de la mise en œuvre de DoStuffInterface sera enregistrer dans le système. Ensuite, dans l'application d'origine que nous aurons quelque chose comme: Si GetDoStuffInterfaceHandler(handlerID) isnot Nothing alors GetDoStuffInterfaceHandler(handlerID).DoStuff(). La définition de l'handlerId à utiliser est configurable (peut-être grâce à une table db, fichier xml ,etc).

    Nous finissons par avoir plusieurs gestionnaires de mise en œuvre DoStuffInterface avec différents Identifiants et de les appeler à des heures différentes.

Avec cette approche, nous avons:

  • la demande de base avec le comportement par défaut
  • un module configurable (l'assemblée) de l'personnalise le fonctionnement de l'application

L'enjeu de cette approche est de trouver le "sweet points" - les comportements que le client pourrait vouloir pour personnaliser et en insérant les crochets de là.

Espère que j'ai été clair dans ma description, si ce n'est... laisser un commentaire :)

1voto

durza Points 61

Si ce n'est pas grave, j'irais avec appp de réglage et de modèle de fabrique. Ou assemblées spécifiques par client.

Mais à partir de balises, il semble que vous voulez résoudre via le contrôle de version. Mais cela va mettre un gros coup sur la fusion etc. Vous aurez à créer une branche pour chaque client et de fusionner les modifications du tronc vers eux.

1voto

supercat Points 25534

Un complément utile à #ifdef ACME/#endif etc. est de définir des macros pour ACME_ONLY(), NON_ACME(), FROBOZCO_ONLY(), NON_FROBOZCO(), etc. les macros. Choses peuvent encore se salissant si de nouvelles versions d'entrer en jeu (dans quel cas faut la nouvelle version se comporter comme Acme, FrobozCo, etc.) mais si il n'y a qu'une seule ligne de la différence entre l'Acme et non-Acme version, cette approche évite les environs de cette ligne par deux lignes de #directives.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X