in Programmazione

.Net 6.0 Single file apps

Nella versione 3.0 di .Net Core è stata introdotta la possibilità di pubblicare un applicazione come singolo file. Questo tipo di pubblicazion è particolarmente utile quando si ha la necessità di distribuire l’applicazione all’interno di un ambiente dove non è stato installato in precedenza il framework .NET.

Il risultato di questo tipo di pubblicazione è una build “self-contained”, in pratica una cartella all’interno della quale è presente tutto quello che serve per poter eseguire l’eseguibile ed ovviamente l’eseguibile stesso.

In passato questo tipo di applicazione mi è stata molto utile per la distribuzione di semplici applicazioni, come ad esempio delle console application che devono eseguire dei task.

Quello che maggiormente spiazza il destinatario del pacchetto è che oltre all’eseguibile, la cartella distribuita contiene numerosi files: ovviamente tutto il necessario per poter eseguire l’applicazione senza la necessità di installare il framework.

Ovviamente, l’utente finale si trova un pò spiazzato, perchè l’eseguibile si troverà proprio all’interno di questa cartella. Spesso è necessario fornigli indicazioni su come trovare il file che dovrà essere eseguito.

Esiste un’ulteriore possibilità: la creazione di un unico file.

Utilizzando il comando:

dotnet publish -r win-x64 -c Release /p:PublishSingleFile=true

si ottiene un unico file (piuttosto corposo in termini di dimensioni) che contiene al suo interno tutte le dipendenze per essere eseguito. Quando viene eseguito, tutte le dipendenze vengono estratte all’interno di una cartella temporanea, un pò come se si trattasse di un file .zip.

Prestazioni

In termini di prestazioni, al primo avvio dell’eseguibile, ci vorrà un po tempo perchè verrà effettuato lo scompattamento delle dipendenze all’interno della tabella temporanea. Gli avvii successivi non avranno questo problema.

Un’altro punto da segnalare è sicuramente la dimensione del file eseguibile, che può facilmente raggiungere i 100Mb di dimensione (contenendo di fatto tutte le dipendenze). Questo problema è stato affrontato all’interno di .NET Core 6.

Inoltre in .NET 3.0 è possibile effettuare la pubblicazione del singolo file, togliendo le dipendenze che non servono. In pratica, si evita di aggiungere le dipendenze che effettivamente non sono usate.

L’idea che è stata alla base della pubblicazione a single file in .NET 6 è quella di non scomprimere più i file delle dipdendenze all’interno della cartella temporanea, ma di farlo in memoria. Inoltre, il team di sviluppo ha lavorato per migliorare l’ottimizzazione delle dipendenze che devono essere utilizzate. Questa funzionalità prende il nome di IL Trimming.

Per poter includere la funzionalità di trimming è possibile usare il flag:

-p:PublishTrimmed=true

ottenendo un file eseguibile senza i file del runtime che non sono effettivamente necessari.

Compressione

Inoltre, a partire dalla versione 6 è possibile utilizzare la compressione del file eseguibil, riducendo ulteriormente la dimensione del file finale. In questo caso è possibile utilzzare l’opzione:

-p:EnableCompressionInSingleFile=true

In questo caso, ovviamente, si avrà un leggero costo iniziale dovuto alla scompattazione dei file, che non sarà percepito negli avvi successivi.

Per maggiori dettagli, ecco il link ai riferimenti Microsoft.