Compile-time only modules

Hi,

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

2 Likes

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 hex.pm
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.

3 Likes

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).

3 Likes

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.

2 Likes

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