2010-11-10 23 views
1

Il y a une question similaire à Best practice for managing project variants in Git? mais le contexte est différent et je soupçonne que la réponse pourrait l'être aussi.meilleure structure git et Xcode pour l'évolution des variantes du même produit

J'ai un produit Cocoa "First" géré avec Xcode et versionné en utilisant git. "First" est toujours en évolution, et est actuellement à sa troisième version.

Puis un client vient et demande une variante de First, appelée Second. Les changements de First à Second affectent beaucoup de fichiers, mais pas tous. Les modifications affectent le code source mais aussi les ressources (éléments graphiques, fichiers nib, listes de propriétés ...).

Maintenant, les deux produits sont vivants et partagent un certain nombre de fichiers communs. Cependant, certains changements tels que des corrections de bugs peuvent s'appliquer aux deux produits. Eventuellement, une nouvelle fonctionnalité pourrait être ajoutée aux deux produits.

Quelle serait la meilleure façon de gérer un tel scénario:

  • avec Xcode
  • avec git

J'ai deux idées, qui sont mutuellement exclusives:

Idée 1: Git branchez «First» en «Second» et appliquez tout changement applicable d'un projet à l'autre. Cela conduit à deux répertoires et projets Xcode totalement distincts.

Idée 2: Ajoutez une cible nommée "Second" au projet Xcode. Maintenant, le même projet Xcode a deux cibles et est utilisé pour développer et construire les deux produits. Mais cela rend difficile la gestion des versions pour First et Second dans git (les versions n'ont aucune raison d'être synchronisées).

L'idée 2 rend le processus de développement parallèle très facile. Le code est toujours synchronisé. Les divergences peuvent être gérées à l'aide de variables de compilation et d'un fichier source unique OU via différents fichiers source. Cela rend la gestion des versions plus obscure.

L'idée 1 est peut-être plus propre, mais alors, quelle est la meilleure pratique pour gérer ce qui reste commun entre les deux projets? Pouvez-vous faire une "fusion partielle" entre deux branches git? Sur quelle base? Ou doit-on le gérer manuellement?

Il peut être possible d'encapsuler et d'extraire une partie commune dans un module ou une bibliothèque, mais pas toujours. Par exemple, je ne pense pas que ce soit possible pour les icônes de document courantes. Le fait de refactoriser "First" afin que tous les éléments communs soient extraits de manière constructible est une entreprise majeure que je préfère faire un peu à la fois. Je réalise qu'il n'y a peut-être pas de solution parfaite. Je cherche des idées et des suggestions. En tant qu'adjuvant git relativement récent, je réalise également que cela peut être une question RTFM. Ensuite, dirigez-moi simplement vers la FM vers R.

Merci beaucoup.

Répondre

0

Ma préférence est idea2. Je le fais actuellement comme un moyen d'écrire un plug-in pour l'application principale, puis les applications client qui vont sur tous les nœuds d'un cluster. Le plug-in et les clients partagent 90% du même code, ce qui rend la maintenance et le débogage super-faciles pour savoir où et comment se passe.