2010-07-09 4 views
3

Quelles sont les pratiques courantes de conception d'une structure de système/projet de construction permettant de cibler plusieurs versions .NET avec des ensembles de fonctionnalités différents?Création d'un système de ciblage de plusieurs versions .NET

Plus précisément:

  • Si vous branche dans le contrôle de la source?
  • Si vous utilisez une compilation conditionnelle?
  • Doit-on dériver des interfaces, ce qui permet de les modifier?
  • Devriez-vous créer des projets "versionX" séparés et lier des fichiers de projet communs?

Répondre

6

J'ai essayé plusieurs façons de procéder.

J'ai exclu la possibilité de branchement car il est difficile de synchroniser toutes les branches en utilisant SVN/TFS. Le SCC distribué dispose d'un support plus avancé pour le branchement/la fusion, donc je prévois de reconsidérer cette approche si jamais je me convertis.

J'utilise une compilation conditionnelle avec des projets spécifiques à une version utilisant des fichiers source liés. La bibliothèque la plus agressive que j'ai faite le long de ces lignes est Nito.Linq, qui n'a pas encore été publiée. Vous pouvez vérifier la source, cependant, pour voir comment j'ai mis en place les projets. Il currently targets 3.5, 4.0, SL3 et SL4, et a "avec Rx" et "sans Rx" variantes pour chacun d'eux. J'avais CF 3.5 fonctionnait aussi bien, mais VS2010 ne le soutient pas.

Il y a quelques inconvénients à cette approche:

  • Dans ma solution, je défini un projet « Sources » qui agit comme un conteneur pour les fichiers. Malheureusement, il est construit lorsqu'il est chargé et je ne peux pas ajouter de fichiers source lorsqu'il est déchargé; donc ça finit par gêner. Lier les fichiers sources dans des projets ciblant différents cadres entraîne un autre problème: il n'est pas possible d'ouvrir le même fichier source dans différents projets. VS vous informera du fait, puis affichera le fichier source déjà ouvert d'un autre projet. Cela affecte IntelliSense, en particulier avec la compilation conditionnelle. Ce n'est pas un spectacle, mais plusieurs fois vous ouvrez un fichier, puis vous devez le fermer et le rouvrir (et ensuite revenir à la position où vous étiez).
  • Les tests unitaires sur VS2010 doivent cibler la structure 4.0. Donc, tout test sur d'autres versions de framework doit être fait de manière non-VS2010. Je n'ai pas encore trouvé une bonne solution pour cela; cela n'affecte pas Nito.Linq car l'unité de test des variantes 4.0 teste tout le code.

J'ai demandé au Rx team comment ils ont géré cette situation (ils supportent les versions 3.5, 4.0, SL3 et SL4 avec la même base de code). Apparemment, ils utilisent un outil interne personnalisé pour créer des versions de métadonnées uniquement des assemblages d'exécution, puis les combiner dans un super-profil contenant les assemblages fusionnés de métadonnées uniquement. Le projet est construit sur ce super-profil et un "reciblage" post-compilation est effectué pour changer le profil du projet en un profil normal.

J'ai résumé brièvement played around avec la construction d'un équivalent open-source de l'outil de l'équipe Rx, mais j'ai rencontré trop de problèmes «sous-documentés». Cela devrait être possible en théorie, mais je me suis dit que cela prendrait trop de temps pour quelqu'un sans les contacts corrects au sein de Microsoft.

+2

Mise à jour: Microsoft a publié la semaine dernière un jeu d'outils appelé [Portable Libraries] (http://msdn.microsoft.com/en-us/library/gg597391.aspx).Il utilise des assemblages de métadonnées uniquement avec des super-profils comme je l'ai décrit ci-dessus. Malheureusement, il ne supporte pas SL ou .NET en dessous de 4.0 (ne supportant pas non plus de cibles CF simples) et nécessite des correctifs pour les runtimes (SL 4.0.60129.0 et .NET KB2468871). Il construit un binaire portable réel, plutôt que plusieurs binaires; la fonctionnalité spécifique à la plate-forme doit donc être effectuée à l'aide de [une forme d'injection de dépendance] (http://tinyurl.com/6esdpdu) à partir de bibliothèques spécifiques à la plate-forme. –

Questions connexes