Awesome Monorepo
A curated list of awesome Monorepo tools, software and architectures. Monorepos, short for mono-repositories, are repositories that contain multiple projects, usually related to each other.
Inspired by vinta/awesome-python.
English | 简体ä¸æ–‡
Contents
- Build systems & dependency management tools
- Repository management tools
- Good reads
- Version control systems & add-ons
- Development process tools
- Notable public monorepos
- Migration tools
Build systems & dependency management tools
- baur builds only changed applications in a monorepo branch and manages build artifacts
- Bazel is Google's monorepo-oriented build system. More on Bazel: awesome-bazel
- Bit is a tool for building and managing JavaScript projects with multiple components, and managing the dependency graph of components.
- Bolt Pkg is a super-powered JavaScript project management.
- Buck is Facebook's monorepo-oriented build system.
- drkns is a simple and language agnostic monorepo build tool.
- Garment is Farfetch's monorepo build system with centralized and customizable task management.
- GitLab CI 11.4 supports running steps based on path changes.
- Lerna is a tool for managing JavaScript projects with multiple packages, built on Yarn.
- MBT is a build tool with differential build support.
- Nix is a package and distribution build tool with remote caching, predominately used by NixOS.
- Nx is a build system for TypeScript monorepos and a set of monorepo management tools.
- OAO is a Yarn-based, opinionated JavaScript monorepo management tool.
- Pants is a monorepo-oriented build system, used by Twitter, Foursquare and multiple other companies.
- Please a cross-language build system with an emphasis on high performance, extensibility and reproduceability.
- pnpm is a JavaScript dependency management tool that supports monorepos through a set of dedicated commands called
pnpm multi
. - Rush Stack is a family of tools geared towards large scale TypeScript monorepos, and based around the Rush build orchestrator
- Spago is a PureScript package manager and build tool powered by Dhall and package-sets.
- Symplify/MonorepoBuilder is a PHP monorepo management tool.
- Tainted is a tool to determine which Go packages need to be rebuilt in a monorepo.
- Versio updates all version numbers in monorepo projects based on conventional commits, and can generate changelogs and tags.
- Yarn is a JavaScript dependency management tool that supports monorepos through workspaces.
- Layer-pack is a Webpack plugin allowing monorepo structures via inheritable npm packages/code layers & es6 glob imports.
- Turborepo is a high-performance build system for JavaScript and TypeScript codebases.
Repository management tools
- Builder is a tool that makes it possible to ship the same scripts across projects in a Node.js monorepo. For example, share build and testing scripts across projects.
- FBShipIt is a library written in Hack for copying commits from one repository to another.
- adeira/shipit is a simplified JavaScript port of FBShipIt.
- Lank is a tool that links packages together in a Node.js monorepo using automatic configuration of
NODE_PATH
instead of symlinks. Lank also allows you to run the same commands across all (or subsets of all) packages. - monorepo-run is a collection of helpers to run scripts in each package of a yarn monorepo with a separated pane per package.
- oao
- Syncpack ensures consistent dependency versions in large JavaScript Monorepos.
- Ultra Runner is a smart script runner and build tool for Lerna, Pnpm, Rush and Yarn. Scripts run concurrently, using the dependency topology. Builds keep track of file changes and are skipped when possible.
- wsrun allows running a command in each package of a Yarn workspaces monorepo.
- meta is a tool for managing multi-project systems and libraries. It answers the conundrum of choosing between a mono repo or many repos by saying "both", with a meta repo.
Good reads
- Why Google Stores Billions of Lines of Code in a Single Repository
- Advantages and Disadvantages of a Monolithic Repository: A case study at Google
- Why you should use a single repository for all your company’s projects
- Advantages of monorepos
- Monorepos make inner-source come to life
- What is a monorepo? (and Should You Use Them?).
- Continuous Integration for Monorepos for Semaphore-CI users.
- monorepo.tools - Monorepos explained
Version control systems & add-ons
Git
Tools
- Git shallow clones let you clone only part of your Git history.
- Git filter-branch let you rewrite a repository's history and prune branches.
- Git clone --single-branch
- Git sparse-checkout
- Git LFS improves the handling of large files in Git.
- GVFS virtualizes the file system beneath your git repo so that git and all tools see what appears to be a normal repo, but GVFS only downloads objects as they are needed. Windows only.
- SlothFS is similar to GVFS, but read-only. It works on Linux and macOS.
- git subtree merges and splits subtrees from your project into subprojects and back. Part of Git since version 1.7.
- git subsplit automates and simplifies the process of managing one-way read-only subtree splits.
- splitsh-lite is a very fast git subtree alternative to splits subtrees from your project into subprojects.
- josh is a git server proxy enabling on-the-fly virtualization of repositories.
- go-diff is a handy tool analyzes which packages needed to be rebuilt due to changes.
- mgt is a tool that enables easy bidirectional sync between multiple repositories via files that define how to remap a repository
Scaling info
- Atlassian's Monorepos in Git and How to handle big repositories in Git cover scaling options for Git.
Mercurial
Tools
Scaling info
Development process tools
Code reviews
- Pull Review Hubot plugin to automate pull reviews with lots of configuration options.
- Rietveld is a code review tool by Google used by Chromium.
- API Extractor is used to detect and review API signatures for TypeScript libraries, and also for publishing a multi-package API reference.
CI tools
- Incremental CI in Jenkins with Bazel, article by Kristina Chodorow (Bazel team).
- bazel-travis is a minimal setup to use Travis CI in a Bazel monorepo.
- buildpipe is a tool to dynamically generate Buildkite pipelines by looking at changes in projects.
- Codefresh is a CI/CD platform for Docker/Kubernetes that has native Monorepo support
- CI/CD for Microservices Using Monorepos, a post describing a Shippable.com build designed for triggering builds specific to the microservice that has actually been modified and ones depending on it.
- Semaphore CI is a CI/CD platform with native monorepo support.
Code ownership
- GitHub's CODEOWNERS can restrict who can approve a pull request that affects a given part of a monorepo.
- Chromium's OWNERS file inspired GitHub's CODEOWNERS.
- Write Guard uses GitHub actions to enforce file-level write access to a monorepo.
- CODEOWNERS generator generates a CODEOWNERS file for your monorepo from files in subfolders.
Notable public monorepos
- Foursquare's opensource projects
- Stellar's Go monorepo
- Habitat's monorepo
- startup-os monorepo: working examples for Google's Open Source tools (bazel, etc) in a monorepo
- M3 monorepo - Distributed TSDB, Aggregator and Query Engine, Prometheus Sidecar, Metrics Platform
- Entria's Full Stack Playground Monorepo
- Berty's monorepo - React-native mobile App + Golang backend + Gomobile bridge + iOS & Android native drivers + Protobuf
- NixOS's monorepo of packages and modules can be used to incrementally build and deploy Linux machines
- Celo's monorepo (includes blockchain, misc tooling, libraries, ops stuff like terraform modules, docs, etc)
- ProtonMail's monorepo (the proton web clients: mail, calendar...)
Migration tools
- Bazel's migration-tooling repository.
- Gazelle generates Bazel BUILD files automatically for Go packages.
- tomono imports an existing set of Git repositories into a monorepo.
- shopsys/monorepo-tools contains a set of tools for building and splitting a monolithic repository.
- Fastlane monorepo migration tools tools for migrating code and github issues. Specific for fastlane so requires some code changes to use
Development Workflows
- Trunk Based Development, a source-control branching model, where developers collaborate on code in a single branch called ‘trunk’, resist any pressure to create other long-lived development branches by employing documented techniques. They therefore avoid merge hell, do not break the build, and live happily ever after.
- Branch By Abstraction, is a set-piece technique to effect a ‘longer to complete’ change in the trunk.
License
To the extent possible under law, Uriel Corfa has waived all copyright and related or neighboring rights to this work.