Monorepo build system for mixed Elixir / Typescript / Other codebase?

Can you recommend a build system for a monorepo?

There is an overwhelming list of build systems and hence approaches to a monorepo here: https://github.com/korfuri/awesome-monorepo; I am looking for some recommendations.

We build an Elixir based server and a bunch of Typescript/Javascript SDK libraries, as well as some microservices (for NodeJS, python platforms).
The projects interact using GraphQL and AMQP (messages in RabbitMQ) APIs.
We found it hard to manage this interoperability using multiple repositories and would like to try out a monorepo.
Each of these projects will have it’s own build system and artifacts - so for Elixir we use standard mix release, for JS we use yarn and publish packages to npm, same for python and packages on pypi.
AFAIR the monorepo build system can help out to mange these project-level build systems on a top, codebase level; I do not have any experience with that so far.

Can you recommend a build system and its approach? Or maybe I do not need any and I just need a top level Makefile / bash script that builds everything recursively ?

1 Like

I’ve had limited success with GitHub - casey/just: 🤖 Just a command runner in polyglot repos but have in mind it’s more of a generic task runner without some truly dedicated DAG dependency management like other modern tools have.

I want to try GitHub - ejholmes/walk: A fast, general purpose, graph based build and task execution utility. but haven’t had a chance yet. I’ve heard good feedback in HN.

2 Likes

While I haven’t used it on a big monorepo yet, I really enjoyed using earthly.dev in a phoenix project with a non-trivial webpack setup.

It’s basically Dockerfile meets Makefile, which is surprisingly powerful since you can use docker images as the base for your targets, so you don’t have to think about how to setup your build environment.

2 Likes

What you normally do is have multiple runners per project. Most of my projects kick off different pipelines in api/, mobile/ or client/ (depending on if there were changes ofc).

I use this pattern on Circle, azure devops and github actions.

Edit: assuming you deploy the various platforms to different places. If your client is served by elixir you would just have another step to compile assets on top of the rest.

While makefiles etc are fine, 99.99% of the time Bash will do just fine.

1 Like