Jak działa Single Executable

0

Wygenerowałem sobie 1 plikowy program w taki sposób:

dotnet new console

do csproja dodałem

<PublishSingleFile>true</PublishSingleFile>

i zrobiłem publish

dotnet publish -c Release -r linux-x64

I dostałem pojedynczy plik, który po przeniesieniu na (w tym wypadku) Linuxa bez zainstalowanego .NET Cora działał bez żadnego problemu

IK0HnYj.png

wszystko fajnie, ale jak właściwie jest realizowany cały ten mechanizm "pakowania" do 1 pliku wszystkiego? jak to działa? czemu więcej softu z tego nie korzysta, a nadal są instalki (pomijając jakieś dodatkowe wymagania dot. instalacji typu wykonywanie skryptów itd), a później po instalacji pełne foldery dllek?

i w sumie dlaczego został wygenerowany *.pdb jeżeli to był Release?

3

Wszystkie niezbędne biblioteki są linkowane statycznie do jednego pliku wykonywalnego. Tam da się jeszcze robić nieco bardziej agresywny trimming, aby zmniejszyć rozmiar pliku wynikowego - patrz np. https://www.hanselman.com/blog/MakingATinyNETCore30EntirelySelfcontainedSingleExecutable.aspx

A PDB się przyda, zwłaszcza jak chcesz debugować "po fakcie" jakieś zrzuty pamięci.

0
Ktos napisał(a):

Tam da się jeszcze robić nieco bardziej agresywny trimming, aby zmniejszyć rozmiar pliku wynikowego

Faktycznie z 76MB na 35MB, dzięki.

2

.pdb jest bardzo pomocny w debugowaniu, możesz go zostawić tylko dla siebie i skopiować go do klienta gdy zgłosi błąd którego nie da się odtworzyć lokalnie.
Czemu więcej softu nie korzysta z pakowania wszystkiego do jednego pliku? Ano dlatego że ten plik będzie duży, w przypadku wydania patcha będziesz musiał wysłać prawdopodobnie cały ten plik, zamiast małej dll-ki (w praktyce jeszcze nie widziałem żeby patch nie obejmował i tak kilku dll-ek no ale w teorii i przy dobrej architekturze ma to szansę działać).
A więcej plików nie znaczy że potrzebny jest instalator - nadal można wydać wersję "portable" którą wystarczy rozpakować - większa liczba plików nikomu raczej nie przeszkadza. Instalatory są raczej po to żeby zmienić ustawienia systemowe, albo spytać o jakieś parametry konfiguracyjne.

Poza tym idea dll-ek kiedyś za czasów gdy 1MB miejsca na dysku kosztował kilka lub więcej dolarów była że jedna biblioteka może zostać używana przez wiele programów - szaleństwo czyż nie? Kiedyś programy instalowały dll-ki bezpośrednio do katalogu windows\system i wiele programów mogło z nich korzystać nie dublując plików na dysku. Potem się okazało że przez lenistwo programistów mało która dll-ka jest wstecznie kompatybilna więc potrzebne są ich różne wersje dla różnych programów i praktycznie tylko systemowe i frameworkowe dll-ki są współdzielone. A teraz doczekaliśmy czasów że nawet dll-ki .neta już nie są współdzielone tylko kopiują się do każdego skompilowanego programu dzięki czemu hello world zajmuje więcej miejsca niż cała moja kolekcja gier z początku lat 90-tych.

0

Ja tutaj widzę korzyść taką, że program jest samodzielny i nie wymaga instalacji .net core do działania. To, że jest to pojedynczy plik nie jest żadną korzyścią.

I nie masz racji, nie zrobisz takiej wersji portable, która by działała bez potrzeby instalacji .net core w systemie (jeśli się mylę, niech ktoś sprostuje)

0

https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet-publish

Packages the app into a platform-specific single-file executable. The executable is self-extracting and contains all dependencies (including native) that are required to run the app. When the app is first run, the application is extracted to a directory based on the app name and build identifier. Startup is faster when the application is run again. The application doesn't need to extract itself a second time unless a new version is used. Available since .NET Core 3.0 SDK.

Dopiero od .NET 5 nie ma być konieczności wypakowywania https://github.com/dotnet/designs/blob/master/accepted/2020/single-file/design.md

1
Meini napisał(a):

I nie masz racji, nie zrobisz takiej wersji portable, która by działała bez potrzeby instalacji .net core w systemie (jeśli się mylę, niech ktoś sprostuje)

jak nie?

Gdy zrobisz to samo co wyżej, ale bez tego dodatku do csproja, to dostaniesz taki portable z frameworkiem (więc bez konieczności instalacji). No różnica taka, że nie będzie jednego pliku, a wiele.

dotnet publish -c Release -r linux-x64

0

W przypadku .net core to tą opcję single file jest dostępna chyba dopiero od 2.2 więc wcześniej możliwe że nikt tego nie używał bo nie było dostępne ?

1 użytkowników online, w tym zalogowanych: 0, gości: 1