Press "Enter" to skip to content

Pubblicare un sito Web con riferimenti ad assembly posti in GAC

Antefatto

All’interno della mia azienda e del mio gruppo di lavoro, esiste un nucleo di DLL di uso generico (General Purpouse – un po’ come Cillit Bang) che contengono classi e oggetti usati in tutti i tipi di progetto.

Per rendere agli sviluppatori la vita più facile, tutte queste librerie sono firmate e pubblicate in GAC sulle macchine di sviluppo.

In produzione invece, ovvero quando installate presso clienti, nessuna delle nostre DLL salvo necessità molto specifiche viene mai installata in GAC.

Fatto

Oggi, il mio collega stava lavorando su una infima applicazioncina WEB (infima perché ha 2 e dico 2 pagine di cui una è la pagina di login).

Preparato il tutto ha deciso di provarla sul nostro server WEB interno che ovviamente non è un PC di sviluppo e non ha le DLL in GAC. Per fare questo ha usato la procedura di Publish del sito web per creare la versione compilata. Lo ha installato e OOPS! mancano tutte le librerie che erano in GAC…

Abbiamo fatto una ricerca sul web e trovato su un forum questa bellissima risposta.

Hi,

This is by design in ASP.NET 2.0.

If you deploy an application that contains a reference to a custom component that is registered in the GAC, the component will not be deployed with the application. In previous versions of Visual Studio.NET, you could set the Copy Local property for a reference, which ensured that the assembly would be deployed. In ASP.NET 2.0, to deploy any assembly with your application, you must manually add the assembly to the application’s Bin folder.

For more information, see http://msdn.microsoft.com/en-us/library/hsy826az(VS.80).aspx

Tesi

Quando si pubblica un sito che usa e comprende delle librerie che si trovano in GAC sulla macchina di sviluppo si deve copiarle tutte a manina nella cartella BIN (quindi se si aggiornano bisogna ricordarsi di ricopiarle ogni volta). Oppure, bisogna lavorare sul server di produzione, oppure bisogna pubblicare sul server destinazione le DLL nella sua propria GAC. Lo stesso ovviamente vale per tutte le librerie non appartenenti al framework ma prodotte da terze parti che utilizziate nella vostra applicazione.

Non so voi, ma io usualmente estirpo la cartella BIN di un progetto molto, molto spesso quando faccio pulizia e rigenero una soluzione :D.

A questo punto è opportuno e necessario dotarsi di un BATCH che ad ogni compilazione del sito e/o ad ogni generazione della versione di pubblicazione si occupi di ricopiarsi tutte le DLL dalle rispettive cartelle alla cartella di pubblicazione.

Purtroppo, i progetti web essendo diversi da tutti i progetti normali non sono dotati del Post Build Event.

Leggendo l’articolo, c’è una certa logica nella motivazione di questa feature, non lo metto in dubbio, però per quanto mi riguarda, tutto questo risolve un problema ma ne crea invece un’altro, ovvero, io rischio di pubblicare un website o creare un pacchetto di installazione con delle DLL obsolete.

Workaround da noi adottato

Aggiungere alla soluzione contenente il website una DLL contenente una classe DUMMY che sul PostBuildEvent esegue un batch che ricopia le DLL usate dal Website e contenute nella GAC sulla macchina di sviluppo all’interno della cartella BIN del website così che il Publish le trovi e noi siamo certi che sono quelle più aggiornate.

Chi avesse idee meno troglodite di questa, magari conoscendo meglio di noi ASP abbia pietà e suggerisca.