Était-ce utile?

La solution

  

"Cela devient une douleur à gérer,   et il ne fera qu'empirer au fur et à   plus de clients commencent à utiliser notre   logiciel. "

La seule façon de vraiment résoudre cette partie est de vous assurer que votre logiciel a une architecture qui prend en charge les personnalisations comme une couche sur le dessus de votre produit de base. Idéalement, ils seraient tout simplement des options de configuration d'exécution (couleurs, logos et activer / désactiver sont parfaits pour cela). Si vous obtenez (ou si vous voulez) un très grand nombre de clients, pousser la configurabilité à droite dans le produit de base et permettre aux clients de faire eux-mêmes la personnalisation.

Lors de la mise à jour, vous construisez (et test) le produit de base une fois , et de construire les versions personnalisées en reliant simplement (référencement) le produit de base déjà construit comme une bibliothèque. Vous pourriez avoir chaque client dans une version séparée, ou vous pourriez avoir un processus de construction unique qui génère des mises à jour pour tous le client actuellement maintenu builds (ce dernier est sans doute mieux pour un plus grand nombre de clients). Si vous avez une version « vanille », vous pouvez construire que dans le cadre du noyau ou en même temps que les versions de client, il dépendra de votre cas particulier.

En fonction de votre technologie, il pourrait être possible d'avoir la couche de personnalisation construite indépendamment du produit de base. Dans ce cas, le client sera reconstruit rarement nécessaire (peut-être que pour certains changements importants) - vous pouvez simplement créer un lien vers le produit de base mis à jour lors de l'exécution. Pour un déploiement au client, vous ne devrez déployer le noyau mis à jour, si vous avez une méthode de déploiement qui prend en charge.

Il est difficile de dire plus en détail sans connaître votre plate-forme, mais vous avez gracieusement gardé cette question agnostique.

Autres conseils

  1. Séparer la commune et les parties personnalisées dans votre arbre source. Cela peut éliminer la grande majorité des fusions, en fonction de vos politiques de test et de libération. Il y a toujours une façon de faire abstraction et à personnaliser une ressource de construction, même si votre processus de construction doit appeler script pour réécrire certains fichiers.

  2. L'utilisation judicieuse de branchement dans un bon système de gestion de code source. Ceux-ci ne sont pas appelés systèmes « gestion de la configuration » pour rien. Ils sont les outils optimisés précisément pour cette tâche, vous allez probablement pas obtenir quoi que ce soit mieux sans construire au-dessus d'un.

Subversion est bonne à mettre en place plusieurs branches, mais enfin je vérifié ne pouvait faire de 3 voies de fusion sur un seul fichier à la fois. Perforce est génial dans ce département car il suit votre historique de branchement sur une base fichier par fichier et utilise pour automatiser la fusion des ensembles entiers de changements entre les branches entières. Il est vraiment le pyjama du chat ici.

Git et darcs peuvent avoir une puissance similaire, mais je n'ai pas utilisé les. Ils semblent reposer sur l'idée que chaque arbre de la caisse de travail aura une copie toutes les modifications depuis le début du temps. Cela semble peu pratique pour moi car je dois garder quelques grandes et l'évolution des SDKs sous contrôle SMC.

On peut dire que, la seule différence doit être une branche de ce que vous avez communiqué, avec les changements du client unique en elle. Ainsi, par exemple:

/project
   /trunk 
   /branches
      /release-v1
   /customer-branches
      /release-v1-google
      /release-v1-microsoft
 ....

Si vos communiqués de clients sont des succursales de vos communiqués de clients. Étant donné que ces branches ne récupérons jamais roulé dans le tronc ou d'une autre branche de sortie, ne pollue pas le développement régulier / branches d'arbre.

Je suppose que cela dépend du niveau de personnalisation dont vous avez besoin pour chaque client, mais pourriez-vous faire de votre application de base « personnaliser » se base sur un fichier de configuration ?, de sorte que vous pourriez avoir le coffre étant l'application complète et ensuite spécial les fichiers de configuration pour chaque client qui contrôlent le look & feel, ainsi que des fonctionnalités qui sont activées, et votre processus de libération prendraient les fichiers de configuration corrects pour déployer dans vos programmes d'installation.

Il semble que si vous livrez toujours des versions de votre application pour chaque client personnalisé (ish), il serait utile de le temps d'étendre l'application de cette façon.

Je mis en place un fichier d'en-tête appelé branding.h qui contient un tas de #ifdefs comme l'exemple suivant pour changer quoi que les bits doivent être changés. Dans Visual Studio, il est facile de mettre en place plusieurs construit avec le symbole client approprié défini.

#if defined BRAND_CLIENT1
#  define COMPANY_NAME  "Client 1"
#  define PRODUCT_NAME  "The Client 1 Widget App"
#  define LOGO_FILE     "res/logoClient1.ico"

#elif defined BRAND_CLIENT2
#  define COMPANY_NAME  "Client 2"
#  define PRODUCT_NAME  "The Client 2 Super Widget App"
#  define ENABLE_EXTRA_MENU
#  define LOGO_FILE     "res/logoClient2.ico"

#endif

Ceci est tout en supposant C ++ bien sûr.

scroll top