Last updated 4 months ago

The folder where we keep all of our systems.

We can imagine the systems folder as a set of "shelves", which hold all of the systems in a workspace.

The RealWorld "shelves" contain one system called 'realworld-backend'

A system is where you assemble selected building blocks into an artefact

A system is where we combine a set of building blocks into a deployable artefact. They are how we turn the monolithic development experience (having all our building blocks in one environment), into horizontally scalability, through the posibility to build and deploy multiple artefacts.

Each system in systems has a minimal project structure; with a file, a project.clj file, a resources folder, and a src folder. Making each system a project allows us to compile them as individual artefacts.

This assembly of selected building blocks into one system is achieved through the magic of symbolic links (notice the little arrows on the src folders). The symbolic links refer to the corresponding folders for each component and base, which live in their respective "drawers". For example, the user symbolic link in systems/realworld-backend/src/clojure/realworld/user points to the components/user/src/clojure/realworld/user folder.

Environments and systems are similar but have different purposes. Environments are used to develop code and therefore includes tests. Systems don't have tests but can build deployables. Systems can only have one base, but environments can have several bases.

Environments can also be used to execute code that you don’t want to deploy or mix with production code. For example, this could be scripts that fix problems with data, or exploratory code that explores external API’s.