Większość tworzonych przez nas aplikacji .NET jest oparta o zewnętrzne biblioteki. W wyniku ich kompilacji programu otrzymamy:
- program EXE lub bibliotekę
- pliki DLL bibliotek zależnych
- dokumentację powyższych w formie *.XML
- plik symboli PDF
- konfigurację programu w formie *.CONFIG
Poniżej przykład aplikacji konsolowej, która korzysta z bibliotek oferujących funkcje kontenera DI oraz serializatora JSON.
W wyniku kompilacji powstało aż 7 plików. Pokażę, jak w łatwy sposób zminimalizować wynik do dwóch plików.
Na początek należy dołączyć do naszego programu pakiet NuGet o nazwie Costura.Fody
https://github.com/Fody/Costura
Od teraz każda kompilacja programu spowoduje, że biblioteki zależne zostaną dołączone do niego jako zasoby. Po kolejnej budowie solucji pozostało tylko 5 plików.
Bardziej dociekliwi mogą zauważyć, że rozmiar pliku wynikowego EXE jest dużo mniejszy niż łączny rozmiar plików DLL na poprzednim zdjęciu. Powodem jest automatyczna kompresja zasobów podczas procesu scalania plików przez Fody.
Aby zapobiec tworzeniu pliku PDB, należy zmienić ustawienia projektu.
W zakładce Build klikamy przycisk Advanced…, w kolejnym oknie zmieniamy dla opcji Debugging information z Full na None i zapisujemy zmiany.
Aby zapobiec tworzeniu plików XML, wymagana jest edycja pliku CSPROJ naszego programu. Aby to zrobić, należy na projekcie wykonać „Unload Project”, następnie „Edit ***.csproj”. Ukażą się ustawienia naszego projektu. Teraz dla odpowiedniej konfiguracji solucji należy dodać linię:
<AllowedReferenceRelatedFileExtensions>.</AllowedReferenceRelatedFileExtensions>
Jest to informacja dla kompilatora, jakie pliki powiązane z DLLkami mogą zostać skopiowane do katalogu docelowego. Przyjmowane wartości to rozszerzenia plików, np. .xml oddzielane średnikiem, np:
.xml;.txt
Celem jest brak jakichkolwiek plików, więc wystarczy wstawić kropkę.
Dzięki tym zabiegom kompilacja solucji skutkuje powstaniem tylko dwóch plików:
Samo narzędzie Costura.Fody jest konfigurowane poprzez plik FodyWeavers.xml.
Znajduje się w katalogu solucji, lecz nie jest do niej domyślnie dołączony. Można to bez obaw zrobić ręcznie.
Początkowa zawartość FodyWeavers.xml:
<?xml version="1.0" encoding="utf-8"?>
<Weavers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="FodyWeavers.xsd">
<Costura />
</Weavers>
Jeśli pewna biblioteka musi zostać pominięta podczas procesu scalania i zostać skopiowana do katalogu docelowego, można użyć opcji ExcludeAssemblies:
<Costura ExcludeAssemblies="SimpleInjector" />
Jeśli chcemy jawnie wskazać, które biblioteki powinny zostać scalone, można użyć opcji IncludeAssemblies. Może ona też posłużyć do tymczasowego wyłączenia działania Costura.Fody, wystarczy wtedy nie podawać żadnej wartości:
<Costura IncludeAssemblies="" />
Dodatkowe informacje
Jeśli korzystamy z VS 2017, podczas budowy możemy komunikat:
Fody is only supported on MSBuild 16 and above. Current version: 15
Aby rozwiązać problem, należy zainstalować Visual Studio 2019 lub skorzystać ze starszej wersji biblioteki Fody, najwyższa wersja wspierana przez VS2017 to 4.2.1.