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.