Awesome
Python Polylith Example
This is a repository with an example Python
setup of the Polylith Architecture using pants
.
Here you will find examples of code being shared between different kind of projects,
and the developer tooling setup.
Have a look at this repository for more information and documentation: Python tools for the Polylith Architecture
Pants and Polylith
A big part of the Developer Experience with Polylith is having access to all of the code in the Monorepo, including the third-party dependencies. Having access to Python code from a REPL and an IDE would require an existing virtual environment.
Pants has really good support for creating virtual environments.
In the Python Community, there is a convention to name the environment in a certain way, usually .venv,
and create it at the Project root (this will play nice with your IDE). The virtual environment
created by Pants is created in a dists
folder, and further in a Pants-specific folder structure.
In addition to the .venv
, package management tools like Poetry, Hatch and PDM have support for
configuring custom source paths. This is useful for the IDE to locate Python source code (especially in Monorepos).
This is usually accomplished by creating a .pth
file, that is stored in the site_packages
folder of the virtual environment.
Tools like Poetry, Hatch and PDM do that when the virtual environment is created.
With a .pth
file in place, you will be able to navigate the Python source code from the IDE as expected.
A custom bash script
At the development/scripts
folder of this repo, you will find a generate-venv.sh
that will create a .venv
with a .pth
file. You are now all set and ready to develop!
The Polylith CLI
By adding the polylith-cli
library to the top pyproject.toml
, the poly
command will be available in the virtual environment.
Activate the virtual environment:
source .venv/bin/activate
You have now access to all the poly
commands.
Example:
poly info
The REPL
With the virtual environment activated, you can also run code using your favorite REPL:
ipython
Packaging projects
Packaging a project can be done using Pants.
Example: creating a wheel
and an sdist
for the my-fastapi-project
pants package projects/my_fastapi_project:my-fastapi-project
PEP 517
Pants will expect a BUILD
file in the project folder. The pants package
goal has support for the
PEP 517 specification.
Polylith is using the pyproject.toml
to define the used bricks in a project.
By adding Hatchling as the build backend, Pants will act as the build frontend for it
and the artifacts will be created according to what's defined in the pyproject.toml
.
The BUILD file of a project:
add the pyproject.toml
and the entry point as dependencies.
resource(name="pyproject", source="pyproject.toml")
python_distribution(
name="my-fastapi-project",
dependencies=[
":pyproject",
"bases/example/greet_api:greet_api",
],
provides=python_artifact(),
generate_setup = False,
)
A project-specific configuration
Example, the build backend:
[build-system]
requires = ["hatchling", "hatch-polylith-bricks"]
build-backend = "hatchling.build"
Example, the Polylith bricks:
[tool.hatch.build.hooks.polylith-bricks]
[tool.polylith.bricks]
"../../bases/example/greet_api" = "example/greet_api"
"../../components/example/greeting" = "example/greeting"
"../../components/example/log" = "example/log"