Polylith
  • Polylith
  • Introduction
    • Sharing code
    • Testing incrementally
    • Polylith in a Nutshell
  • Architecture
    • Workspace
    • Component
    • Base
    • Project
    • Development project
    • Bring it all together
    • Simplicity
  • Tool
    • Overview
  • Conclusion
    • Current architectures
    • Advantages of Polylith
    • Transitioning to Polylith
    • Why the name "Polylith"?
    • Videos
    • FAQ
    • Who made this?
Powered by GitBook
On this page
Export as PDF
  1. Architecture

Project

Projects configure Polylith's deployable artifacts.

PreviousBaseNextDevelopment project

Last updated 1 year ago

A project is the result of combining one base (or in rare cases several bases) with multiple components and libraries.

The artifacts that are built based on the projects are the end goal of the Polylith architecture, which we deploy in our test, staging and production environments.

Each project lives in a separate directory under the projects directory, where it has a configuration file:

▾ workspace
  ▾ projects
    ▾ myproject
        deps.edn

The configuration file lists all included bricks and project level libraries (brick level libraries are implicitly included):

{:deps {poly/change        {:local/root "../../components/change"}
        poly/creator       {:local/root "../../components/creator"}
        poly/file          {:local/root "../../components/file"}
        poly/git           {:local/root "../../components/git"}
        poly/help          {:local/root "../../components/help"}
        poly/lib           {:local/root "../../components/lib"}
        poly/migrator      {:local/root "../../components/migrator"}
        poly/shell         {:local/root "../../components/shell"}
        poly/util          {:local/root "../../components/util"}
        poly/validator     {:local/root "../../components/validator"}
        poly/version       {:local/root "../../components/version"}
        poly/ws-file       {:local/root "../../components/ws-file"}
        poly/poly-cli      {:local/root "../../bases/poly-cli"}

        org.clojure/clojure {:mvn/version "1.10.3"}
        org.slf4j/slf4j-nop {:mvn/version "1.7.32"}}}        

This is also why the Polylith architecture can be used without tooling support and still give us most of its benefits.

Example projects can be found in the , the , and in the .

Some languages, like Clojure, support having more than one src directory out of the box, or support including "projects" as in the example above, while other languages may need a plugin, like the .

It's almost like magic, because all we have to do is to list all our building blocks used in e.g. a service, and everything will automatically "connect" without the need of dependency injection, annotations or any other "magic"! is how that looks like in the User Manager example app.

RealWorld example app
User Manager example app
Polylith Tool
build-helper-maven-plugin
Here
This project has one library (grey), two components (green) and one base (blue).