A .NET Framework fejlesztés esetén alkalmazásunk publikálásához először le kellett fordítanunk a programunkat Release konfigurációban. Ezt követően rajtunk múlt, hogy hogyan szeretnénk terjeszteni az alkalmazást. Vagy készítettünk egy telepítőt, ami feltelepítette a szükséges keretrendszert is, mint függőséget, vagy a végfelhasználóra bíztuk ennek a megtételét és csak egy tömörített archívumként adtuk oda a fájlokat.
Utóbbi megoldás kényelmesebb abból a szempontból, hogy csak be kell csomagolni a fájlokat és kész. Viszont a módszer hátránya, hogy a keretrendszer maradt függőségként.
Ezen változtatott a .NET Core, mivel bevezette a lehetőséget, hogy az alkalmazásunk mellé csomagoljuk a futtatókörnyezetet is. Ezt a folyamatot hívjuk publikálásnak.
A publikálás egyszerű, csupán a dotnet parancsot kell meghívnunk megfelelő attribútumokkal:
dotnet publish [solution.sln] -c [konfiguracio] -r [os_runtime] -o [kimeneti_konyvtar]
A parancs részei:
- [solution.sln] – A Solution fájl, amit publikálni szeretnénk
- [konfiguracio] – A publikálni kívánt konfiguráció Debug vagy Release lehet alapból, de újat is kreálhatunk a Visual Studio-ban
- [os_runtime] – A cél operációs rendszer azonosítója
- [kimeneti_konyvtar] – A kész, publikált alkalmazás ide fog mentődni.
A -r kapcsoló és a cél operációs rendszer azonosító megadása nélkül az alkalmazásunk futtatásához a felhasználóknak telepíteniük kell majd a célzott keretrendszerünket.
A -r kapcsoló után beírható aktuális azonosítókat a https://docs.microsoft.com/en-us/dotnet/core/rid-catalog oldalon találjuk meg. .NET Core 3.0 esetén az alábbi cél operációs rendszerek támogatottak a teljesség igénye nélkül:
| Azonosító | Leírás |
|---|---|
| win-x64 | Windows 10 X64 |
| win-x86 | Windows 10 X86 |
| win-arm | Windows 10 32 bit ARM |
| win-arm64 | Windows 10 64 bit ARM |
| linux | Linux X86 |
| linux-x64 | Linux X64 |
| linux-arm | Linux ARM 32 bit |
| linux-arm64 | Linux ARM 64 bit |
| osx-x64 | macOS 10.12 vagy újabb |
Trimmelés
A Core 3.0 újdonsága volt publikáláskor a trimmelés. Korábban, ha a keretrendszert az alkalmazás mellé csomagoltuk, akkor a teljes keretrendszer oda másolódott az alkalmazás mellé. Ez 70-100MiB mérettel is meg tudta dobni az alkalmazásunkat.
Cserébe viszont kaptunk egy, az operációs rendszerre jellemző futtatható bináris fájlt, ami elindította az alkalmazásunkat és a keretrendszert hozzá.
A trimmelés a keretrendszer méretét csökkenti, méghozzá úgy, hogy a nem használt (soha meg nem hívott) metódusokat eltávolítja a publikálásra kerülő keretrendszerből.
A trimmelést a projektfájl módosításával tudjuk bekapcsolni. A solution fő, futtatható projektjébe egy szimpatikus, vagy új <PropertyGroup> tagba kell az alábbi beállítást elhelyezni:
<PublishTrimmed>true</PublishTrimmed>
A trimmelés önmagában nem túl hatékony. A teljes programot és keretrendszer függőségét egy fájlba is tudjuk publikáltatni. Ekkor egy natív futtatható állomány keletkezik, amit a felhasználó egy dupla kattintással el tud indítani.
Ennek az engedélyezéséhez az alábbi beállítást helyezzük el:
<PublishSingleFile>true</PublishSingleFile>
<PublishReadyToRun>true</PublishReadyToRun>
A fenti két megoldás használatával egy tipikusan 70MiB környéki alkalmazás mérete levihető 15MiB környékére, ami egy ~80% környéki méretcsökkenést jelent.
Természetesen a méretcsökkenés nagy mértékben fog függeni az adott alkalmazástól.
Ha az alkalmazásunk bizonyos szerelvényeket (dll) reflection segítségével tölt be, akkor külön meg kell őket jelölni, hogy ne legyenek belőle eltávolítva részek, mert ez problémát okozhat.
Például ha a reflection segítségével betöltött szerelvényünk neve Szuper.Reflection.dll, akkor az alábbi sorokkal kell kiegészítenünk a projektünket:
<ItemGroup>
<TrimmerRootAssembly Include="Szuper.Reflection" />
</ItemGroup>
Itt megjegyezném, hogy ha reflection segítségével töltünk be dolgokat, akkor a betöltődő szerelvény kódja nem biztos, hogy natív kódra át lesz fordítva publikáláskor. Ez némi lassulást okozhat a programunkban ahhoz képest, mint ha nem reflecion segítségével töltenénk be. Továbbá méretben is nagyobb futtatható fájlt kapunk.