Domanda

Ok, quindi ecco lo scenario.

Progetto A ha una libreria di classi sviluppato per esso (consente di chiamare MyLib). Ho rilascio del progetto A (in progetto di casa) con la versione 1 di MyLib.

I iniziare lo sviluppo su Project B, ma espandere MyLib alla versione 2, tra cui un paio di ottimizzazioni per i tipi esistenti.

Se rilascio mylib 2 sia del progetto A e progetto B, ho intenzione di avere a ricompilare Progetto A per sostenere tipo cambia, qualcuno ha soluzioni a questo che sono vero e provato?

È stato utile?

Soluzione

Il mio suggerimento: Continuous Integration.

Utilizzando uno strumento come CruiseControl.NET si potrebbe fare una ricostruzione di ogni progetto / soluzione c'è, anche avere l'output di uno (il dll) caricati sorgente di controllo per essere utilizzato da altri progetti, avere unit test eseguito ogni tempo in modo da poter verificare se le aggiunte / modifiche in un progetto utilizzato in soluzione a non si rompono soluzione B utilizzando anche quel progetto. È possibile impostare la build automatica ogni notte o innescare uno manualmente dal app CruiseControl.NET systray.

Altri suggerimenti

Si può provare a assemblaggio reindirizzamento e hanno Project A caricare il più recente versione della libreria. Ciò richiederebbe che si aggiunge le informazioni di reindirizzamento alla configurazione di tutte le macchine che l'applicazione viene eseguita su, ma non avrebbe dovuto ri-compilazione. Si potrebbe fare questo nel file di configurazione dell'applicazione o in vicinanza delle macchine.

Un esempio da tale articolo di ciò che il file sarà simile:

<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>

Naturalmente, se hai rotto la compatibilità con la libreria originale nella nuova versione questo non è andare a lavorare.

Se non ti piace @ direzione di reindirizzamento assemblaggio di Steven, e supponendo che non si vuole ricompilare Progetto A, si può solo distribuire privatamente diverse versioni di MyLib a ciascun progetto.
Progetto A sarebbe poi basta continuare a utilizzare la versione 1 e Project B sarebbe utilizzare la versione 2. Questo sembra essere quello che si vogliono ascoltare - ed è banale da fare. O mettere la dll MyLib nella cartella di ogni progetto (o una sottocartella) e ciascun progetto sarà automaticamente ritirare la rispettiva versione locale, oppure è possibile StrongName nel GAC, e hanno ogni progetto raccogliere la versione specifica avete compilato contro.
Questo è in realtà il comportamento predefinito, e non c'è bisogno di fare nulla complessa per raggiungere questo obiettivo.

Dare MyLib un nome sicuro e installarlo al GAC . Il GAC può avere più versioni dello stesso assembly. Sarebbe necessario dare un nome sicuro per la versione 1 di MyLib (non solo la versione 2).

Progetto A vuole la versione 1 del MyLib e lo trova nel GAC. Progetto B vuole la versione 2 di MyLib e lo trova nel GAC. Ognuno è felice, e non c'è bisogno di tenere 30 copie di diverse versioni di MyLib nella stessa directory dei gruppi che li utilizzano, ricreando DLL-inferno.

So che Avid citato il GAC pure, ma come alternativa alle copie private per gli eseguibili. Penso che dovrebbe essere evitato.

Ecco un'altra opzione, anche se si dovrebbe prendere seriamente in considerazione le altre opzioni prima.

ProjectA riferimento MyLib.dll, che risulta essere la versione 1.

Regolare il nome di output del progetto MyLib di produrre "MyLib.2.dll". (Si potrebbe anche creare un nuovo progetto, ma che suona come eccessivo.)

Rebuild MyLib e ProjectB. ProjectB verrà ora riferimento MyLib.2.dll, lasciando ProjectA e MyLib.dll completamente insensibile.

La tua domanda è del tutto generale. Cosa vuoi achive? Dovrebbe presentarsi in un utilizzare la versione 2 del lib o la vecchia versione?

Se A dovrebbe utilizzare la versione 1, quindi forte di denominazione o privato distribuzione dovrebbe risolvere il problema. Ma penso che allora non whould aveva fatto la domanda.

Se A dovrebbe usare la versione 2, allora la soluzione dipende dalle vostre modifiche. Se l'interfaccia del complesso non è cambiata (ma solo interni algoritmi) allora A deve funzionare con V2 senza ricompilazione. Se l'interfaccia è cambiata, si dovrà regolare il progetto A ogni modo e non ci può essere una soluzione generale.

Per mantenere le modifiche necessarie piccolo un gestibile è una questione di buon design dell'oggetto / interfaccia. Ma come fare, che non può essere risolta senza particolari circa gli oggetti e le modifiche necessarie.

Vorrei mettere tutto il mio codice in un controllo di versione, come Subversion (uso di rami e tag) e automatizzare il processo di compilazione. Io uso FinalBuilder .

Perché si ha il controllo della biblioteca che consiglierei rami di rilascio modello .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top