vans163

vans163

Does anyone know how to force certain-files/project to recompile if compiletime envvars changed?

Example I have a config.exs like so

region = System.get_env("REGION", "us") |> String.to_atom()
config :app, :region, region

and code that uses it

defmodule MyModule do
    if Application.compile_env!(:app, :region) == :us do
      def lol() do "United" end
    else
      def lol() do "United in another language" end
    end
end

I would like MyModule to recompile (outside a release setting) if REGION envvar changed.

Example doing

REGION=us iex -S mix
compile
REGION=us iex -S mix
nothing
REGION=ca iex -S mix
compile
REGION=us iex -S mix
compile

I can change compile_env to get_env, then the app just runs without recompiling anything. I rather not crash, and not false negative.

Showing Posts 1 to 5

Ljzn

Ljzn

The simple solution is write a compiler task to edit the code file each time to force recompile.

defmodule Mix.Tasks.Compile.ForceRc do
  use Mix.Task

  def run(_args) do
    File.write("[path of your module]", " ", [:append])
    IO.puts "edited"
  end
end

run mix compile to load this module. Then add it before other compilers in mix.exs

compilers: [:force_rc, :phoenix, :gettext] ++ Mix.compilers(),

Then every time you run iex -S mix, the file you specified will be re-compile.

It is such a stupid solution :sweat_smile: Could someone tell me how to force elixir recompile a file, without changing the file content.

Nicd

Nicd

You should be able to use mix compile --force to force recompilation of the project.

vans163

vans163 OP

This is pretty creative, I think it might be possible to work something along these lines, like reading back the AST of the module that used Application.compile_env!/2 and if the compile_env func cached the wrong envvar, force a recompile by doing mix compile --force.

Yea but I would like it to autodetect when to execute a force recompile, so only if certain ENVVARS changed from the last time it got compiled.

evadne

evadne

Note Elixir source, Mix.Tasks.Compile.App:

  defp app_changed?(properties, mods, compile_env) do
    Keyword.get(properties, :modules, []) != mods or
      Keyword.get(properties, :compile_env, []) != compile_env
  end

You can probably use this in conjunction with runtime configuration like in config/runtime.exs introduced as in Elixir 1.11, see Elixir v1.11 released - The Elixir programming language so stuff System.get_env(name) in config/runtime.exs and use Application.compile_env/3 to get it.

However IMO this is a smell and is best avoided

jsonmaur

jsonmaur

For anyone still having issues with this, you can use __mix_recompile__?/0.

— All posts loaded —

Where Next? Top

Trending in Questions Top

katta
I having some trouble figuring out if I have set myself too strict of standards for my production server. Currently I can handle 75% of r...
New
brecabral
Documentation While reading the Scoped Routes section, I noticed that the documentation currently refers to a problem without explainin...
New
achenet
Hello, I’m trying to build a basic Phoenix web-app, and I’d like to use Tailwind. However, when I launch mix phx.server, I get an error...
New
kpanic
Hi everyone, I am toying with the idea of building a “match maker” for giving personal help to people that wants to start coding. I sta...
New
asweet-confluent
I recently noticed that Elixir’s Logger defaults its primary log level to :debug when no :logger, :level application configuration is pre...
New
Cxx-mlr
I’m working on a small exercise involving update_in/3, and I came up with this solution: data = %{ name: "Periodic Table", category:...
New
ChrisAmelia
I’ve got trouble wrapping my head around the order in which functions are called in this snippet (from Phoenix’s authentication): toke...
New

Other Trending Topics Top

GenericJam
Edit: 2026 May 15 - This post is archived. Mob is alive!! Main docs: mob v0.7.11 — Documentation A bit of explanation for the slightly c...
New
JesseHerrick
Hey, I’m Jesse and I’m the main contributor behind Dexter, a full-featured, lightning-fast Elixir LSP optimized for large codebases. It s...
New
mudasobwa
I am happy to introduce the very α version of the new programming language compiled to BEAM. Welcome Cure. It has literally three kille...
New
garrison
Hobbes is a low-level distributed database for the Elixir programming language. Hobbes provides a simple, safe, and scalable storage lay...
New
mhanberg
Hi everyone! The first release candidate for the Expert language server project is now available! We’ve published a press release detai...
New
budgie
A little off-topic, but I feel like people here have a good head on their shoulders. I used to be quite good at making software. Was luc...
New

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews