I was playing around with moving some config files to YAML rather than JSON, and the library Im using requires that it is added to extra_applications.
The problem is that it is never started when I run iex -S mix so I get errors.
I did open a github issue, but it seems I missed this in the readme:
when running mix tasks that depends on other apps you need to manually ensure all the apps are started (by either calling Application.ensure_all_started(:myapp) or Mix.Task.run “app.start”, )
So, at the moment I use this to load some constants from a JSON file and create functions for converting constants:
defmodule App.Const do
@app_dir File.cwd!
@const_files Path.wildcard("#{@app_dir}/lib/domain/**/constants.json")
for filename <- @const_files do
# Watch for changes and recompile
@external_resource filename
file_consts =
filename
|> File.read!
|> Poison.decode!
# Creates functions for each constant
for {key, value} <- file_consts do
# Skip comments - hacky but meh
unless key === "//" do
def encode(unquote(String.to_atom(key))), do: unquote(value)
def decode(unquote(value)), do: unquote(String.to_atom(key))
end
end
end
end
Basically I just wanted to try using YAML files for them - largely because they support comments and I wouldn’t have to do the hacky part above where I check for ‘//’ as the key (I then use the value as the comment)
Now, if I put it into a function, it works ok - I assue because everything is loaded up before I call it
def get_consts do
path = Application.app_dir(:ctx_voip, "priv/constants.yml")
file_consts = YamlElixir.read_from_file(path)
end
But just switching the file_consts = ... part out above results in an error, which is from the library not being loaded yet.