pnezis
We are open sourcing workspace a set of tools for working with elixir monorepos, inspired by rust workspaces and nx.dev. Twitter announcement
You can find the docs here.
There are many reasons for having a monorepo but working with them may be cumbersome. Workspace provides a set of tools for working with big monorepos efficiently.
What is a workspace?
A workspace is nothing more than a git repository hosting multiple mix projects in any arbitrary folder structure. Path dependencies are used for cross project dependencies similarly to umbrellas.
The central concept of the workspace is the workspace graph. This is a directed acyclic graph where the nodes represent projects and the edges the dependencies between projects.
Workspace uses git to get the changes between two revisions. Knowing which files have changed we can deduce which project is modified or affected:

Running tasks
You can run any command from the root on all or a subset of the workspace projects. You can also run time consuming tasks only on the affected projects significantly improving CI times for large codebases.

Checking your workspace
When your workspace grows, it can go out of hand quickly. You need a way to check that your projects are properly defined. With the workspace.check task you can among other:
- Ensure that specific dependencies are set on all projects, e.g.
ex_doc. - Ensure that external dependencies versions match the expected ones.
- Verify that no forbidden dependencies are defined.
- Ensure that all projects have common build paths
Enforcing boundaries
One of the main purposes of monorepos is to help you split your codebase into independent, cohesive and reusable packages. You can enforce a clean architecture by tagging your projects and enforcing boundaries between them.
Creating a workspace
You can create a new workspace with the workspace.new scaffolder:
mix archive.install hex workspace_new
mix workspace.new your_workspace
Helper packages
The workspace repo is itself a workspace and comes with two extra small packages.
cli_options- provides an opinionated way to parse CLI options based on a schema similarly toNimbleOptionscascade- is a small library for generating code for templates.
Disclaimer
Despite being stable (we successfully use it internally to manage a massive elixir codebase consisting of hundreds of packages) this is still a 0.x.x project and breaking changes may happen.
Trending in Announcing
Other Trending Topics
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #code-sync
- #javascript
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #blog-post
- #phoenix_html
- #iex
- #graphql
- #ai
- #genstage
- #elixirconf-us
- #websockets
- #supervisor
- #advent-of-code
- #distillery
- #processes
- #api
- #forms
- #metaprogramming
- #security
- #hex














Showing Posts 1 to 10- Show Best Posts
- Show All Posts (oldest first)
- Show All Posts (newest first)
davydog187
This is a really exciting start!
We’ve recently moved to GitHub - casey/just: 🤖 Just a command runner · GitHub after we gave up on running various tasks through Mix. We will definitely give this a try and report back
mindreframer
Very interesting! How do you deal with IDE integration? Something specific? It does not work with ElixirLS on a hello-world example with package_a and package_b.
pnezis
I don’t have any specific settings. Do path dependencies work in general for you?
mindreframer
Yes, they do. But I have to open each package as single folder in VSC for ElixirLS to work properly. So I thought maybe you have some tips how to open the full workspace in an IDE and still have it working. But that is probably a deep rabbit hole.
Also, a separate _build folder is maintained per package folder, right?
mindreframer
Would be curious about a small workspace example project with CI configs, some boundary checks and suggested folder layout for a bigger project. If that is not too much effort.
Looks really solid, I like that it provides enough structure and flexibility! Thanks for open-sourcing it.
pnezis
Indeed, this is something that can be worked on.
This is up to you. We use common
depsand_buildpaths, and also enforce it using workspace checkspnezis
Workspace is dogfooding workspace so it is a simple example. It’s github CI is a nice example. You will see that in PRs only the affected projects are tested, while on the main branch the tasks are ran across all projects.
Regarding the project structure it’s up to you and how you wish to organize your code. In our case we prefer a domain oriented shallow folder structure. I will release the workspace demo project I used for the screenshots, which also includes some boundary checks.
mindreframer
Awesome! I didn’t notice, that workspace itself uses workspace, that’s cool! Yep, I guess I will have some fun time study-ing the codebase.
Thanks a lot!
cmo
Very cool. I’ll definitely be giving this ago after switching to a monorepo recently.
Are you using vscode’s workspaces? In the main menu there is “add folder to workspace”. I’ve done this for each folder and have an extension installed that opens a terminal for each one.
mindreframer
Yeah, vscode workspaces could be a solution. I was hoping for something a bit simpler, but with monorepos there is no such thing.
Maybe it’s good enough though.