Mpanarin
Hello everyone.
I am experiencing an issue, which I am pretty sure is caused just by me not understanding stuff. Which is usual ![]()
I am currently writing a small package. Its only purpose is providing a few helper mix tasks. I want them to be configurable by the user through his Config but provide some defaults as well.
The issue is that even though I specified :env: key in the &application/0 in mix.exs the defaults are still missing and all of my Application.compile_env calls are failing obviously.
I traced the issue to my application not getting loaded. But why? I don’t understand why the hell application that I am trying to compile is not getting loaded?
Elixir version is 1.10.3 compiled with erlang 23.
important contents of the mix.exs:
defmodule FooBar.MixProject do
use Mix.Project
def project do
[
app: :foobar,
version: "0.1.0",
elixir: "~> 1.10"
]
end
def application do
[
extra_applications: [:logger],
env: [
foo: "bar"
]
]
end
end
somewhere in the project:
defmodule FooBar.Spam do
@foo Application.compile_env!(:foobar, :foo)
end
and when I run mix compile I get an error:
** (ArgumentError) could not fetch application environment :foo for application :foobar because the application was not loaded/started. If your application depends on :foobar at runtime, make sure to load/start it or list it under :extra_applications in your mix.exs file
So, the issue is pretty clear - application is not loaded. And if I load it manually when standing on pry it works.
My question is why it is not loaded by default? If I should load it myself, where is the best place to do so?
Trending in Questions
Other Trending Topics
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #code-sync
- #javascript
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #blog-post
- #phoenix_html
- #iex
- #ai
- #graphql
- #genstage
- #elixirconf-us
- #websockets
- #supervisor
- #advent-of-code
- #distillery
- #processes
- #api
- #forms
- #metaprogramming
- #security
- #hex










Showing Posts 1 to 9- Show Best Posts
- Show All (oldest first)
- Show All (newest first)
Matsa59
I think Application — Elixir v1.20.2 could help you. I don’t spent many times on application but I think you miss
modIf someone could confirm (I don’t have my computer :/)
Edit : after re-reading I feel like I’m wrong and don’t reply to your problem
Mpanarin
Yes, as far as i understand
:modkey is for custom startup process. Like starting a supervision tree, etc.But, tbh, my app is more of a library and not an OTP app per se and i don’t really need custom start logic…
In the same docs it is written
So I expect it to load the application as well :\
Matsa59
Gonna check this morning, is it an open source project?
Matsa59
Sounds like it doesn’t read value from the function
applicationinmix.exs. If you write it in any config file it works …Can’t find any mention of that behavior anywhere …
Edit: add code bellow
Return
:error, it seems the env var define inapplication/0is available only in runtime.Mpanarin
Thanks for the answers. But I still don’t understand.
It seems like
compile_env!just doesn’t work at all…Using
fetch_envdoesn’t help at all as it will just return:error. It will compile, yes, but the app still won’t be loaded and therefore values will still be empty. I just don’t understand why mix doesn’t load the application.Shouldn’t it load the app on compile? Or when the task is run?
It looks like mix simply ignores it at all!
I think I will open an issue in elixir repo as I am starting to get really frustrated and the docs are not helpful here at all :\
Matsa59
In fact it’s a « normal » behavior. You asked for a compiled env. but
application/0sounds like to be available only in runtime.So it doesn’t compile because you want a compiled env var that is not available.
However I don’t know if it’s a normal that the ˋapplication/0` is not available in compile time.
Share the issue please, I would like to follow that
For the moment add your env in config file it should work.
hauleth
Using
application/0:envfor compile-time-only environment values seems at least strange. Why use:envinstead of theconfig/config.exsthough?And to answer your question more directly, as you see in documentation
.appfile is compiled after all Elixir files (ascompile.appneeds list of all modules in application), so it cannot be available during compilation. If you want to have compile-time environment then useconfig/config.exs.Mpanarin
Okay, that makes sense now, thanks for the answer! Then, I am fixing my issue in the wrong way.
I am writing a library and publishing it to hex. I want to make this library configurable I use compile env values throughout. But, as
config.exsof my library won’t get published to hex as well as not available to the user of the library, I want to provide some defaults. As far as I understood I have only 2 options at this:compile_env/3and provide defaults there. But that seems like a bad idea, as all of my defaults will be scattered.:envkey in application. Which works a bit differently than I expected and not an option for me.Am I missing something? Is this truly the only available options?
hairyhum
Hi,
This is somewhat a workaround, but it seems to be working for me.
I have my default configuration in the
config/config.exsand adding following to themix.exs:After I run
mix compilethere is my config in theebin/my_app.appfileBecause
config/config.exsis loaded before the compilation,mix compile.apphas access to the application config.I’m not sure if that idiomatic, but it works.