Wyszedł nowy elixir (1.5) a wraz z nim kilka fajnych opcji debugowania kodu. Jednak zanim do nich przejdę (czyli następnym razem) warto wspomnieć o jednej która już istnieje od dawien dawna – to znaczy, nie wiem jak dawno dawno ale na pewno z rok? Jak wiadomo elixir przychodzi z REPL iex. A ten REPL zaś przychodzi z rozszerzeniami do siebie. Tak zwanym modułem IEx.Helpers – gdzie Helpers jest importowane w niewidoczny dla nas sposób (poniżej link dlaczego i jak). Jedną z metod jaka będzie dostępna po załączeniu modułu to pry/0 – umożliwia nam ona ustawianie pułapek w kodzie. Jeżeli tylko nasz kod na nią natrafi w konsoli pojawi nam się informacja czy chcemy zatrzymać proces i debugować dostępne wartości.
Przygotujmy sobie środowisko, tym razem wystarczy nam czysty plik z modułem, może to być Bencode.ex jak i każdy inny. Do skorzystania z opcji dostępnych przez moduł IEx musimy go dodać do początku naszego pliku. Dodajemy my go za pomocą require i dodajemy go przed defmodule!!!
Początek pliku powinien mniej więcej tak wyglądać:
require IEx; defmodule Bencode do # .... end
Następnie w każdym miejscu, w którym byśmy chcieli z debugować nasz kod musimy dodać wywołanie funkcji IEx.pry/0. Dla przykładu możemy do dodać tutaj:
def decode (input) do
val = input |> do_decode |> elem(0)
IEx.pry
case val do
nil -> {:error, "wrong format: #{input}"}
el -> {:ok, el}
end
end
Mając tak kod przygotowany jesteśmy gotowi do testów. Wystarczy teraz odpalić iex z naszym plikiem:
iex bencode.ex
Jeżeli zaś jesteście na windows to może się okazać, że dostaniecie taki oto błąd:
iex(1)> Bencode.decode("i15e")
Cannot pry #PID<0.118.0> at lib/bencode.ex:57. Is an IEx shell running? If you are Windows, you may need to start IEx with the --werl flag.
Cannot pry #PID<0.118.0> at lib/bencode.ex:38. Is an IEx shell running? If you are Windows, you may need to start IEx with the --werl flag.
{:ok, 15}
iex(2)>
Jak widać miałem dwa IEx.pry/0 ustawione i dwa nie zadziałały. Jest to pewnie spowodowane problemem z otwieraniem i zamykaniem okien/terminali w Windows gdyż podczas pracy z IEx.pry/0 będziemy ubijać i na nowo tworzyć procesy iex. By naprawić ten problem wystarczy odpalić iex następująco:
iex --werl bencode.ex
To nam stworzy okno erlanga w którym nasz iex będzie hostowany:

Teraz możemy zacząć się bawić, wystarczy, że odpalimy polecenie:
iex(1)> Bencode.decode("i15e")
I dostajemy takie o to pytanie:
Interactive Elixir (1.4.4) - press Ctrl+C to exit (type h() ENTER for help) Request to pry #PID<0.105.0> at lib/bencode.ex:38 val = input |> do_decode |> elem(0) IEx.pry case val do Allow? [Yn] Y
W zależności od odpowiedzi, albo zostanie stworzony proces pry albo i nie, jeżeli zostanie to będziemy mieć nowy przedrostek w konsoli:
pry(1)>
Teraz możemy dowiedzieć się takich rzeczy jak, jaki jest numer PID aktualnego procesu, jakie wartości kryją się pod input czy value:

Powrót do iex następuje po wykonaniu funkcji respawn/0:
pry(4)> respawn
Interactive Elixir (1.4.4) - press Ctrl+C to exit (type h() ENTER for help)
{:ok, 15}
iex(1)>
Podsumowanie
To tyle, prosty sposób a jednak o nim nie wiedziałem. Czy jest on przydatny? Nie wiem, trzeba modyfikować kod, wstawiać metodę by dostać odpowiednie zapytanie. A co jeżeli takie coś przypadkiem trafi na produkcje? Słabo? Trochę. Ja bym tego unikał. Jednak do zabawy lokalnie i obserwacji jak elixir działa lub jak nasza funkcja działa moim zdaniem bardzo fajne narzędzie nie wymagające mix.
Za tydzień zaś opiszę nowości z elixir 15 gdyż one trochę zmieniają to podejście dając więcej fajniejszych opcji, które rozwiązują problemy IEx.pry/0.















[…] Elixir #44 – Debugowanie z wykorzystaniem IEx.pry […]
Comments are closed.