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.
The approach I take for not including some modules in a dependency is this:
- Create a directory
my_app/dev so that there is now
- Add the code for the modules I don’t want to publish in the
mix.exs adjust compiler paths to include
- 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
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
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 I did’t want to initially but if there is no other solution why not.