Confusion about loading static assets with :code atom and :code.priv_dir/1

Hi everyone,

I’m working on a small Elixir project that needs to include a text file as a resource. I found on some other posts that this file should exist in the project’s /priv directory and that I should get the path to priv like this: :code.priv_dir(:my_project), and then add the file name to the end using Path.join/2.

This is working fine, but what’s confusing to me is that this seems to be leveraging Erlang functions.

When I run h :code in iex I can see that it represents the Erlang code server, which led me to find this page in the Erlang docs: Erlang -- code

There, I was able to find the documentation for priv_dir/1 that I had been struggling to find on hexdocs.

So here’s my question:

Is this the generally accepted way to load a static asset in Elixir? Are there any functions in Elixir that do the same thing, but don’t require making calls to :code? Are there any other functionalities in Elixir that require making calls to Erlang functionality?

There’s not a strong boundary between “Elixir stuff” and “Erlang stuff” - they both ultimately run on the BEAM, and Elixir uses a lot of Erlang functionality with only a thin wrapper on top; for instance, many of the functions in the Elixir Map module mostly exist to make the underlying Erlang functions play nice with |>:

Historically, it’s been much harder to use Elixir code from Erlang than the other way around, so libraries that need to function in both contexts tend to be written in Erlang. IIRC that is changing nowadays with work being done to bring Hex and rebar closer together.


I believe you can use Application.app_dir/2 and point the second argument to the "/priv/..." file you want to access. I don’t think there is anything wrong with using :code.priv_dir/1 directly though.