Elixir Kernel.tap

Elixir 從 1.12.0 開始,新增了一個function 叫 Kernel.tap/2,官方的範例是這樣使用 1 2 iex> tap(1, fn x -> x + 1 end) 1 可以看到 1 pipes 進 tap 這個 function 裡面以後,不管 function 裡面做了什麼事情,他都會回傳 1,也就是當初傳入 tap 時的參數 這個有什麼好處呢?我們有時候在 pipes 的過程中,會需要做一些像是副作用的效果,但又想要保持傳出去的參數不變,所以有時候會不小心就這樣寫 1 2 3 4 5 6 7 8 9 10 11 12 def do_something_b(val) do do_other_thing(val) # ... val end def do_thing() do val |> do_something_a() |> do_something_b() |> do_something_c() end 但其實我們可以用 Kernal.tap() 來做到一樣的事情,就如同文章一開始的範例一樣 1 2 3 4 5 6 7 8 9 10 def do_something_b(val) do do_other_thing(val) end def do_thing() do val |> do_something_a() |> tap(&do_something_b/1) |> do_something_c() end 看一下 Elixir 原始碼是怎麼做到這件事情...

July 7, 2023 · 1 min · 132 words · Me

Data migration 如何確認資料狀態?

前陣子開發團隊為了要方便做 data migration,參考了Migrating Production Data in Elixir,主要是講如何實作一個 migration 的機制,最終用起來的手感就跟 db migration 一樣方便,但每次合併 data_migration PR 後,都要在 slack 上提醒其他人本機端(local)要記得執行 data_migration,難免覺得稍嫌麻煩,覺得是不是能像是 db_migration 一樣,在執行的時候,在 server 的 log 裡面顯示訊息。 像是這樣: 1 2 Phoenix.Ecto.PendingMigrationError at GET / there are pending migrations for repo: Falcon.Repo. Try running `mix ecto.migrate` in the command line to migrate it 後來透過 PendingMigrationError 找到 Phoenix 是如何實作這個過程,原來是透過 phoenix_ecto 來實現確認功能。 在 Phoenix 專案裡面的 endpoint.ex 會看到這個檔案,裡面有一段 code 是這樣 1 2 3 4 5 6 7 8 # Code reloading can be explicitly enabled under the # :code_reloader configuration of your endpoint....

June 30, 2023 · 2 min · 354 words · Me