shahryarjb

shahryarjb

Elixir developer `iex` does not load module that uses macro, when it is compiled

Hello friends, I do not think this problem of mine exists in production build ( I did not test it), but in developer mode iex -S mix.

imagine you have this module

defmodule PluginWorker do
  use Worker, concurrency: 1
  
  def perform(event: event, type: :start) do
    ....
  end
end

If I run my iex, and call it inside the function_exported? it returns true.

but when I use it like this:

  @impl true
  # The task completed successfully
  def handle_info({ref, _answer}, %{ref: ref} = state) do
 
    Process.demonitor(ref, [:flush])
    
    # HERE
    function_exported?(PluginWorker, :worker?, 0)
    |> IO.inspect(label: "=-==-=-=>") # false

    Queue.new(%{
      worker: PluginWorker,
      error: %{type: :continuously, max_try: 5, delay: 1000}
    })

    {:noreply, %{state | ref: nil}, {:continue, :start_service_restoring}}
  end

As you see it returns false my question is, how can have this builded in iex developer env and test, and the other problem is, it is a problem in production build? like release

Test mode

In test mode I am forced to call some modules in test_helper.exs file before testing, because without it inside my tests they are no be compiled before

for example:

ExUnit.start()

# Help to compile workers
MishkaInstallerTest.Support.MisWorkerOne.worker?()
WorkerTwo.worker?()
WorkerThree.worker?()
PluginWorker.worker?()

Thank you in advance

Marked As Solved

03juan

03juan

In dev and test modes the system is running in interactive mode, so the module may not be available before you try to use it. You can use ensure_loaded!/1 before function_exported?/3 to force the BEAM to load it. You wouldn’t have this problem in production because all modules are loaded at start-up in embedded mode.

Code loading on the Erlang VM

Also Liked

03juan

03juan

Great!

Just 2 things to keep in mind.

You don’t need to test for the environment.

If the module is already loaded, this works as no-op. If the module was not yet loaded, it tries to load it.

Maybe use the ! version so the compiler fails in case the module isn’t found, otherwise you’ll only find out at runtime like you saw in your failing tests.

03juan

03juan

I think you can use it in the module declaration just above the handle callback, then it’s only run once during compilation

shahryarjb

shahryarjb

Yes after your help, I put it like this

defmodule MishkaInstaller.PluginsManagement.Event do
  use GuardedStruct
  use GenServer
  ...
  import MnesiaAssistant, only: [er: 1, erl_fields: 4]

  if Mix.env() in [:dev, :test] do
    Code.ensure_loaded(PluginWorker)
  end

 def ... do
    ....
 end

Where Next?

Popular in Questions Top

pmjoe
I have a relationship of love and hate with Elixir. Lots of things are just absolutely right, but there are some things that are kind of ...
New
JorisKok
I have a server on AWS, and was running a load test using artillery. When looking at the Phoenix dashboard I see the Ports going to 100% ...
New
Harrisonl
We have an ECS cluster with 4 services, where each task joins a single cluster, via discovery ECS discovery service. Currently when I de...
New
freewebwithme
Using vs code and installed ElixirLS: support and debugger. And I got an error popped up on start up says Failed to run ‘elixir’ comma...
New
ovidiubadita
Hey all, I discovered Elixir and I love it. I always wanted to learn a functional programming and I intended to go for Haskell, but afte...
New
WestKeys
Currently suffering from paralysis by [HTTP client] analysis. This is rather unusual in Elixirland as there tends to be consensus on the ...
New
Patoshizzle
After calling mix ecto.create I get this error: 17:00:32.162 [error] GenServer #PID<0.412.0> terminating ** (Postgrex.Error) FATAL...
New
Mooodi
Given a string, how can I get access to its character by index? Enum.at("my_string", 2) doesn't work. Or rather, not char, but a substr...
New
9mm
I am constructing a JSON object (map) and I need to conditionally set a field. I’m trying to write proper elixir-way code… and I’m at a l...
New
romenigld
I am trying to run a deploy with docker and I successfully runned with this command: docker build -t romenigld/blog-prod . but when I t...
New

Other popular topics Top

Qqwy
Update: How to use the Blogs & Podcasts section You can post links to your blog posts or podcasts either in one of the Official Blog...
3268 119930 1237
New
JakeBecker
TL;DR: I’ve just released an implementation of Microsoft’s IDE-independent Language Server Protocol for Elixir. It adds language support ...
1140 51847 244
New
_russellb
I want to try my hand at web scraping. What tools/libraries do I need to use. I’m hoping to turn this into something professional so don’...
New
jononomo
I am trying to figure out how Mix knows whether the environment is test, dev, or prod -- where is this set? Thanks.
New
vertexbuffer
Hello, can anybody help here..? I have a list of players and I what to delete an element, but every for loop the list is reverting to ori...
New
stefanluptak
Hello everybody, usually, I use a 29" ultra-wide monitor for VSCode which can easily accomodate explorer (files panel) + file with code ...
New
electic
Hi, I am new to Elixir. I am trying to use the DateTime component to insert a date into MySQL however the there seems to be no way to fo...
New
WestKeys
Currently suffering from paralysis by [HTTP client] analysis. This is rather unusual in Elixirland as there tends to be consensus on the ...
New
josevalim
Hi everyone, One of the features added to Elixir early on to help integration with Erlang code was the idea of overridable function defi...
New
siddhant3030
Hi, I have to write a raw query for one of my project. But till now I have used ecto queries and don’t have much experience writing raw ...
New

We're in Beta

About us Mission Statement