RudManusachi
What configs will make sense to put to runtime.exs?
–
A bit of how I configure apps:
I have generic configs in config/config.exs,
dev-specific parts are in dev.exs,
test-specific - in test.exs,
etc.
In dev.exs and test.exs I have some configs set with System.get_env/2… while for Prod environment specific configs go to releases.exs with strict System.fetch_env!/1 so application fails to start if it’s not configured explicitly, and I’m happy with it.
Looks like with runtime.exs I’ll have to use if config_env() == :prod all over the place to switch between System.get_env/2 and System.fetch_env!/1
I only see the case when System.get_env/2 is acceptable in prod as well as in dev/test then probably it would make some sense, but even then defaults for prod and dev sometimes are different.
Surely I’m missing something.
Trending in Discussions
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
- #ai
- #phoenix_html
- #iex
- #elixirconf-us
- #graphql
- #genstage
- #websockets
- #supervisor
- #advent-of-code
- #distillery
- #processes
- #api
- #forms
- #hex
- #security
- #metaprogramming










Showing Posts 1 to 9- Show Best Posts
- Show All (oldest first)
- Show All (newest first)
Eiji
Simply:
releases.exs- runtime configuration forreleaseonly#{Mix.env()}.exs- i.e.dev.exs,prod.exs,test.exs- those are compiletime environment-specific configuration filesconfig.exs- compiletime generic configuration filereleases.exs- runtime generic configuration filePlease look that machine which compiles code does not needs to run it. When calling
System.get_env/1it’s not executed in some kind of configuration queue, but immediately! This means that machine building code (regardless if it would run it or not) must have specified all environment variables.Obviously it causes many troubles especially when same project was deployed to multiple machines when each of such machine wanted different environment configuration. It has been partially solved by
releases.exswhich now should be replaced by more genericruntime.exs.I recommend to watch this video:
Nicd
My opinion in a nutshell:
If you are on Elixir v1.11, use
config/runtime.exsfor all configuration by default.Make files like(EDIT: Turns outconfig/runtime_dev.exsas needed and useconfig_env/0to check which one to import.config/runtime.exsdoesn’t support imports.) Only move configuration toconfig/config.exsthat you know that you need to set at compile time.This should give you the easiest path forward as your configuration will behave the same way in dev, test, prod, and release by default.
RudManusachi
@Eiji thanks, I saw that video, but looks like I missed one important point:
This helps to understand the position of core team! Thanks!
@Nicd
Thank you! I forgot about
import_config()function! Now it totally makes sense!50kudos
There are two aspects that have been mixed. Env-driven and (compiletime | runtime)-driven file naming.
It appears we move toward the the latter. So in the end we should only have config/compiletime.ex(s?) and config/runtime.exs.
IMHO, Additional *_dev | *_test | *_prod is nice in theory. In practice it’s confusing rather than nicely managed separately.
Finally, with (compiletime | runtime)-driven file naming. Those files are going to be similar to Ruby’s Gemfile where shared config is on the top, then env based groups on the bottom. Though configs can be a lot in a single file, but again IMO, huge single file is pretty much good (same as we’re good with a module has full of documents hundreds of lines).
Nicd
Well that is a silly limitation. If it’s only a policy decision, then I don’t agree with it.
LostKobrakai
The problem is knowing which files need copying. Unless imported files can be statically determined at buildtime the release won‘t be able to know which config files to include additionally.
Nicd
Ah true, maybe we could just limit it so that the argument must be a string literal. But I can live with it.
Eiji
I’m not an
Elixircore developer, but I guess that we would stay withconfig/config.exs.ElixirandPhoenixdoes not put so much requirements. UnlikeRuby/Railsyou can freely create a filemy_file.excontaining moduleMyModule. The only requirement here is that we need to start with something, so the only requirements are:mix.exsconfig/config.exsconfig/runtime.exsEven those are not 100% required as you can write
Elixirsingle file scripts. Also when writing library you don’t haveconfigdirectory at all.The rest is up to developers. If you think that
config/config.exsis too big you can split it in any way. If you don’t want to do so then simply don’t. All templates generates a generic code. It’s up to you what you would do with it. Nobody stops you from writing whole project by hand without using any generator.Look that previously we had only
config/config.exsand because it causes problems we have nowconfig/runtime.exs. If you do not need runtime-specific configuration nobody forces you to use it.Well … First of all
config/runtime.exswas added mainly for environment-specific configuration, so most probably (except really big projects) we would have just a few simple configuration entries without even checking the environment or just for one environment (likeprod-only credentials from system environment). Secondly if there would be a really strong reason for supporting copying of files I would not be surprised ifElixircore team would add an extraprojectoption (for copying files based on pattern) inmix.exsfile.LostKobrakai
Additional files can be included via an overlay as well, but given it’s documented as not being able to use imports I guess by now the core team seems to not even want to go there.