Compile-time only modules


I need to create modules (predefined Struct based on a JSON schema). To help compiling those modules, I will write a MyCompiler module to provide macros, logics, checks, etc.

But I would like this MyCompiler module not to be compiled itself. Actually I would like to skip producing a beam file for this particular module, so when my code is used (as a dependency) the compiler is not available.

Thank you


The approach I take for not including some modules in a dependency is this:

  1. Create a directory my_app/dev so that there is now my_app/lib and my_app/dev.
  2. Add the code for the modules I don’t want to publish in the my_app/dev directory
  3. In mix.exs adjust compiler paths to include my_app/dev
  4. In the package/0 function in mix.exs, don’t include the my_app/dev directory in the package so the code never makes it to
1 Like

I guess it would not work in my case because those modules are required to compile the regular modules.

As far as I can tell this is not supported at the module-level granularity in elixir (I have been begging for this feature). There may be a way to do it with some trickery. If you need something like this you can only do it at the package/deps level by flagging a package as runtime: false.

That’s my understanding too. I would also like to have “compile time” modules - but the only alternative I’m aware of would be to delete the “compile time only” beam files after compilation and that definitely seems like a recipe for future disaster.

I can’t even find an “after compilation” hook lol what is this peasant programming language :rofl:

You could write your own “compiler” and add it to the end of the compiler chain and use it to clean things up. It just doesn’t feel very clean though.


Oh damn, thanks for the tip

It will require that part of the code to be a library (been there) so you can make your compile-time-only module part of such library and then mark it as runtime: false which will make it to not be included in release (still required as a dependency though).


Ahh, thats a neat trick. So to confirm: a dependency marked runtime: false is not included in the release package at all? Thats sounds a solid approach with the work being required by the dependency author and not the library consumer (as it should be).

Unless it will be specified in :included_applications then it will be fully omitted in the release. However it will still be available for downstream users during their compilation time, the also will be able to opt-in to include that into their release.


I may do that then :slight_smile: I did’t want to initially but if there is no other solution why not.