Fody ciekawa ptaszyna – część 2

Ponieważ popełniłem kiedyś coś co nazwałem Fody ciekawa ptaszyna – część 1 to w związku z tym należało zrobić coś co nazywa się Fody cz2 co też obecnie czynie.

Fody ma wiele pakietów, ale opiszę teraz tylko te wybrane z których kiedyś korzystałem (lub widziałem sens ich zastosowania).

Costura.Fody

Costura.Fody

Tworząc aplikacje okienkowe musimy również przemyśleć sposób ich dystrybucji. Należy go dostosować do poziomu zaawansowania klienta oraz do nakładów pracy związanych z danym sposobem. Pisząc dużą aplikację wymagającą instalacji innych programów należałoby się zastanowić nad instalatorem (np WiX). Często są to jednak programy na tyle małe, że instalator to poprostu strata czasu. Gdy tworzymy program, którego grupą docelową są użytkownicy technicznie zaawansowani to zwykle wystarczą pliki binarne i źródła (np. ILSpy). Także dla aplikacji wykorzystywanych jedynie wewnątrz firmy za proces dystrybucji wystarczy po prostu przekazanie (w tej lub innej formie) plików binarnych. Po prostu wiem, że mam doczynienia z ludźmi dla których operacja skopiowania plików nie stanowi najmniejszego problemu. Często jednak taki niewielki program piszę się dla zewnętrznego klienta. I tu zaczynają się schody.
Najczęściej instalator nie wchodzi w grę ponieważ klient nie zapłaci dodatkowo za stworzenie specjalnie tylko dla niego instalatora (jeśli zapłaci to oczywiście jak najbardziej go robimy). Większość klientów ma specjalną dedykowaną osobę (tzw. “informatyka”), na którą spada obowiązek instalacji nowego softu. Jest jednak mały procent klientów, którzy nie posiadają nikogo do pomocy (a to oni dziwnym zrządzeniem losu najczęściej zamawiają takie niewielkie aplikacje). Wtedy z pomocą przychodzi właśnie Costura.Fody. Dzięki temu pakietowi cała nasza aplikacja jest buildowana do jednego pliku.
W celu użycia tego pakietu należy go ściągnąć nugetem:

Install-Package Costura.Fody

Do naszego projektu zostaje dodany plik FodyWeavers.xml z następującą zawartością

<?xml version="1.0" encoding="utf-8"?>
<Weavers>
  <Costura/>
</Weavers>

Wystarczy zrobić teraz build naszego projektu i mamy execa wraz z bibliotekami scalonymi w jedno. Jak jednak słusznie zauważył Krzysztof Morcinek w katalogu Release naszej aplikacji dalej mamy pliki dll. Wystarczy więc zgodnie z jego instrukcją dodać do pliku csproj następującą sekcje.

<Target AfterTargets="AfterBuild;NonWinFodyTarget" Name="CleanReferenceCopyLocalPaths">
  <Delete Files="@(ReferenceCopyLocalPaths->'$(OutDir)%(DestinationSubDirectory)%(Filename)%(Extension)')" />
</Target>

I mamy teraz czysty katalog z execiem (oraz z plikami pdb i configiem ale je możemy odpuścić albo pozbyć się odpowiednio modyfikując plik csproj bądź dodając odpowiednie post build events).
Załóżmy jednak, że musimy przetestować inteligencje użytkownika (jak to zgrabnie ujął jeden z moich współpracowników). Np. jedna z dll musi być widoczna bo będziemy ją w przyszłości zmieniać. Wtedy modyfikujemy nasz plik FodyWeavers.xml w następujący sposób

<?xml version="1.0" encoding="utf-8"?>
<Weavers>	
  <Costura>
    <ExcludeAssemblies>
      SampleDll
    </ExcludeAssemblies>
  </Costura>
</Weavers>

gdzie SampleDll to nazwa dllki, której nie chcemy wciągać do execa. Należy przy tym zwrócić uwagę, że użycie komendy która oczyści wcześniej nasz folder spowoduje również usunięcie dllki, którą chcemy zachować (albo rybki albo akwarium) i musimy ręcznie zadbać o jej dostarczenie do określonego folderu. Inną sprawą jest sens takiego zachowania jeśli mamy użytkownika, który ma problemy z kopiowaniem plików.

Usable.Fody

Usable.Fody
Jak często spotykacie się z kodem w którym mimo możliwości użycia Interfejsu IDisposible roztargniony dev o tym zapomniał? Jeśli jest to kod, który został wyprodukowany przez nas zespół to problem w zasadzie nie istnieje. Po prostu poprawiamy kod i tyle. Ale co zrobić w sytuacji gdy nie mamy dostępu do kodu źródłowego a koniecznie musimy wprowadzić IDisposible. Wystarczy wtedy tylko zainstalować pakiet Usable.Fody

Install-Package Usable.Fody

I tak jak w każdym przypadku użycia Fodyego dodawany jest plik FodyWeavers.xml

<?xml version="1.0" encoding="utf-8"?>
<Weavers>
  <Usable />
</Weavers>

Od tej chwili nasz kod wykorzystuje dobrodziejstwo IDisposible (może nie w sposób optymalny ale zawsze)
Kto nie wierzy niech napiszę taki kod (i skompiluje go do dllki):

public class Test : IDisposable
{
  public void DoSomething()
  {
    Console.WriteLine("Do Something");
  }

  public void Dispose()
  {
    Console.WriteLine("Dispose!");
  }
}

a następnie podepnie go do aplikacji konsolowej

class Program
{
    static void Main()
    {
        var test = new Test ();
        test.DoSomething();
    }
}

i porówna wynik z zainstalowanym pakietem Fody i bez.

Podsumowanie

To oczywiście tylko niewielki wycinek możliwości pakietów Fody. Polecam obejrzeć we własnym zakresie MethodTimer.Fody dzięki któremu w prosty sposób pomierzymy czas wywołania metod, MethodDecorator.Fody czyli sposób na AOP by Fody. A może ktoś kogo zainteresowałem napiszę własny pakiet Fody? Who knows?

One thought on “Fody ciekawa ptaszyna – część 2

  1. Pingback: dotnetomaniak.pl

Comments are closed.