le maintien des assemblages de bibliothèque de classes utilisées par de multiples projets

StackOverflow https://stackoverflow.com/questions/1156000

Question

Bon, alors voici le scénario.

Le projet A a une bibliothèque de classes développée pour elle (Appelons il MyLib). Je relâche projet A (dans le projet de la maison) avec la version 1 de MyLib.

Je commence le développement sur le projet B, mais élargissons MyLib à la version 2, y compris quelques optimisations à des types existants.

Si je libère myLib 2 à la fois du projet A et B, je vais devoir recompiler Projet A à soutenir les changements de type, quelqu'un at-il des solutions à ce qui a fait ses preuves?

Était-ce utile?

La solution

Ma suggestion: l'intégration continue.

L'utilisation d'un outil comme CruiseControl.NET vous pourriez faire une reconstruction de chaque projet / solution il y a, même avoir la sortie d'un (.dll) transféré à la source contrôle à utiliser par d'autres projets, des tests unitaires courir tous les temps de sorte que vous pouvez vérifier si des ajouts / modifications dans un projet utilisé dans la solution a ne rompt pas la solution B en utilisant également ce projet. Vous pouvez définir la construction à chaque nuit automatique ou déclencher une manuellement à partir de l'application CruiseControl.NET systray.

Autres conseils

Vous pouvez redirection et assemblage projet ont une charge la version plus récente de votre bibliothèque. Il faudrait pour cela que vous ajoutez les informations redirect à la configuration de toutes les machines que l'application est exécutée sur mais vous ne pas avoir à recompiler. Vous pouvez le faire dans le fichier de configuration de l'application ou au niveau de la machine.

Un exemple de cet article de ce que le fichier ressemblerait à ceci:

<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="myAssembly"
          publicKeyToken="32ab4ba45e0a69a1"
          culture="en-us" />
        <bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

Bien sûr, si vous avez cassé la compatibilité avec votre bibliothèque d'origine dans la nouvelle version cela ne va pas travailler.

Si vous n'aimez @ la direction de Steven de redirection d'assemblage, et en admettant que vous ne voulez pas recompiler le projet A, vous pouvez simplement déployer en privé différentes versions de MyLib à chaque projet.
Projet A serait alors tout simplement continuer à utiliser la version 1, et le projet B utiliserait la version 2. Cela semble être ce que vous voulez entendre - et il est trivial de le faire. Soit mettre le dll MyLib dans le dossier de chaque projet (ou sous-dossier) et chaque projet choisira automatiquement la version locale respective, ou vous pouvez les StrongName dans le GAC, et ont chaque projet ramasser la version spécifique que vous compilez contre.
Ceci est en fait le comportement par défaut, et vous n'avez pas besoin de faire quoi que ce soit complexe pour y parvenir.

nom fort et installer au GAC. Le GAC peut avoir plusieurs versions du même ensemble. Il faudrait donner un nom fort à la version 1 de MyLib (et pas seulement de la version 2).

Projet A veut la version 1 du MyLib et il trouve dans le GAC. Projet B veut la version 2 de MyLib et il trouve dans le GAC. Tout le monde est heureux, et vous ne devez pas conserver 30 copies des différentes versions de MyLib dans les mêmes répertoires des assemblées qui les utilisent, recréer l'enfer DLL.

Je sais que avid mentionné et le GAC, mais comme une alternative à la copie privée pour les executables. Je pense qu'il faut éviter.

Voici une autre option, bien que vous devriez sérieusement considérer les autres options d'abord.

ProjectA référence MYLIB.DLL, qui se trouve être la version 1.

Régler le nom de sortie du projet MyLib pour produire « MyLib.2.dll ». (Vous pouvez aussi créer un nouveau projet, mais qui sonne comme surpuissant.)

Reconstruire MyLib et ProjectB. ProjectB va maintenant faire référence à MyLib.2.dll, laissant ProjectA et MYLIB.DLL ne sont pas affectés.

Votre question est tout à fait générale. Que voulez-vous achive? Une version du projet doivent d'utiliser 2 de votre lib ou l'ancienne version?

Si A doit utiliser la version 1, puis nommer forte ou le déploiement privat devrait résoudre votre problème. Mais je pense que vous ne whould avait posé la question.

Si A doit utiliser la version 2, la solution dépend de vos modifications. Si l'interface de l'ensemble n'a pas changé (mais seulement des algorithmes internes) alors A devrait fonctionner avec V2 sans recompilation. Si l'interface a changé, vous devrez ajuster le projet A de toute façon et il ne peut pas être une solution générale.

Pour conserver les modifications nécessaires petit un managable est une question de bonne conception objet / interface. Mais comment faire cela ne peut pas répondre sans plus de détails au sujet de vos objets et les modifications nécessaires.

Je mettrais tout mon code dans un contrôle de version comme Subversion (utilisation des branches et des étiquettes) et d'automatiser le processus de construction. J'utilise FinalBuilder .

Parce que vous avez le contrôle sur la bibliothèque, je recommanderais branches de libération motif .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top