PHPackages                             talentuno-official/composer-monorepo-plugin - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. talentuno-official/composer-monorepo-plugin

ActiveComposer-plugin[Utility &amp; Helpers](/categories/utility)

talentuno-official/composer-monorepo-plugin
===========================================

1.0(5y ago)056MITPHP

Since Apr 10Pushed 5y agoCompare

[ Source](https://github.com/talentuno-official/composer-monorepo-plugin)[ Packagist](https://packagist.org/packages/talentuno-official/composer-monorepo-plugin)[ RSS](/packages/talentuno-official-composer-monorepo-plugin/feed)WikiDiscussions master Synced today

READMEChangelog (1)Dependencies (4)Versions (36)Used By (0)

Composer Monorepo Plugin
========================

[](#composer-monorepo-plugin)

```
Note: this project is still experimental. Please provide feedback!

```

This plugin adds support for Monorepos when using Composer package manager. It introduces a maintainable approach to managing dependencies for multiple packages in a single repository, without losing the benefits of having explicit dependencies for each separate package.

Repositories managed with this plugin contain two kinds of packages:

1. Composer packages defined by a single global `composer.json` with all external dependencies at the root of the repository.
2. Many monorepo packages in sub-folders of the project, each with its own `monorepo.json`, a simplified `composer.json` file.

Dependencies in monorepos can be either a third party Composer package that is listed in the `composer.json` or a monorepo package contained in the project.

This plugins build step generates autoloaders with `vendor/autoload.php` files for each package with access to the explicitly specified dependencies only.

The following steps are performed by this plugin when building the autoloads:

1. It detects `monorepo.json` files in subdirectories excluding `vendor/` and marks them as roots of packages.
2. It then fetches all composer packages from the locally installed packages.
3. Finally for each package with `monorepo.json` it generates a `vendor/autoload.php` file using all the dependencies defined in that package from either other monorepo packages or regular Composer packages.

This plugin draws inspiration from Google [Blaze/Bazel](http://bazel.io/) and Facebook [Buck](http://facebook.github.io/buck/) implementing a single monolithic repository for whole projects/company. It's the missing piece for the monolithic repository workflow using PHP and Composer.

More details about reasoning on Gregory Szorc's blog:

- [On Monlithic Repositories](http://gregoryszorc.com/blog/2014/09/09/on-monolithic-repositories/)
- [Notes from Facebooks Developer Infrastructure at Scale F8 talk](http://gregoryszorc.com/blog/2015/03/28/notes-from-facebook's-developer-infrastructure-at-scale-f8-talk/)

Backwards Incompatible Changes in v0.12
---------------------------------------

[](#backwards-incompatible-changes-in-v012)

In v0.12 we removed the `fiddler` script and the possibility to build a PHAR archive. This project is now a first-class composer plugin only and requires Composer v1.1+ for the `composer monorepo:` commands to be available.

The `fiddler.json` files must be renamed to `monorepo.json`.

Use v0.11.6 or lower if you don't want to break this in your project yet.

Installation
------------

[](#installation)

Add the composer monorepo plugin to your root composer.json with:

```
$ composer require beberlei/composer-monorepo-plugin

```

It will be automatically added as a Composer plugin.

Usage
-----

[](#usage)

Whenever Composer generates autoload files (during install, update or dump-autoload) it will find all sub-directories with `monorepo.json` files and generate sub-package autoloaders for them.

You can execute the autoload generation step for just the subpackages by calling:

```
$ composer monorepo:build

```

You create a `composer.json` file in the root of your project and use this single source of vendor libraries across all of your own packages.

This sounds counter-intuitive to the Composer approach at first, but it simplifies dependency management for a big project massively. Usually if you are using a composer.json per package, you have mass update sprees where you upate some basic library like "symfony/dependency-injection" in 10-20 packages or worse, have massively out of date packages and many different versions everywhere.

Then, each of your own package contains a `monorepo.json` using almost the same syntax as Composer:

```
{
    "deps": [
        "components/Foo",
        "vendor/symfony/symfony"
    ],
    "autoload": {
        "psr-0": {"Foo\\": "src/"}
    }
}

```

You can then run `composer dump-autoload` in the root directory next to composer.json and this plugin will detect all packages, generate a custom autoloader for each one by simulating `composer dump-autoload` as if a composer.json were present in the subdirectory.

This plugin will resolve all dependencies (without version constraints, because it is assumed the code is present in the correct versions in a monolithic repository).

Package names in `deps` are the relative directory names from the project root, *not* Composer package names.

You can just `require "vendor/autoload.php;` in every package as if you were using Composer. Only autoloads from the `monorepo.json` are included, which means all dependencies must be explicitly specified.

Configuration Schema monorepo.json
----------------------------------

[](#configuration-schema-monorepojson)

For each package in your monolithic repository you have to add `monorepo.json`that borrows from `composer.json` format. The following keys are usable:

- `autoload` - configures the autoload settings for the current package classes and files.
- `autoload-dev` - configures dev autoload requirements. Currently *always* evalauted.
- `deps` - configures the required dependencies in an array (no key-value pairs with versions) using the relative path to the project root directory as a package name.
- `deps-dev` - configures the required dev dependencies

Git Integration for Builds
--------------------------

[](#git-integration-for-builds)

In a monorepo, for every git commit range you want to know which components changed. You can test with the `git-changed?` command:

```
composer monorepo:git-changed? components/foo $TRAVIS_COMMIT_RANGE
if [ $? -eq 0 ]; then ant build fi
```

###  Health Score

32

—

LowBetter than 69% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity8

Limited adoption so far

Community16

Small or concentrated contributor base

Maturity75

Established project with proven stability

 Bus Factor1

Top contributor holds 79.9% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~66 days

Recently: every ~4 days

Total

32

Last Release

2057d ago

Major Versions

v0.16.4 → 1.02020-11-13

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/10680497?v=4)[Talentuno](/maintainers/Talentuno)[@talentuno](https://github.com/talentuno)

---

Top Contributors

[![beberlei](https://avatars.githubusercontent.com/u/26936?v=4)](https://github.com/beberlei "beberlei (107 commits)")[![boekkooi](https://avatars.githubusercontent.com/u/399895?v=4)](https://github.com/boekkooi "boekkooi (6 commits)")[![wjzijderveld](https://avatars.githubusercontent.com/u/450201?v=4)](https://github.com/wjzijderveld "wjzijderveld (4 commits)")[![pmmaga](https://avatars.githubusercontent.com/u/1273069?v=4)](https://github.com/pmmaga "pmmaga (4 commits)")[![timroberson](https://avatars.githubusercontent.com/u/913294?v=4)](https://github.com/timroberson "timroberson (2 commits)")[![eFrane](https://avatars.githubusercontent.com/u/237165?v=4)](https://github.com/eFrane "eFrane (1 commits)")[![orthographic-pedant](https://avatars.githubusercontent.com/u/14522744?v=4)](https://github.com/orthographic-pedant "orthographic-pedant (1 commits)")[![bronek89](https://avatars.githubusercontent.com/u/3485209?v=4)](https://github.com/bronek89 "bronek89 (1 commits)")[![ribeiropaulor](https://avatars.githubusercontent.com/u/376830?v=4)](https://github.com/ribeiropaulor "ribeiropaulor (1 commits)")[![robotoer](https://avatars.githubusercontent.com/u/1199079?v=4)](https://github.com/robotoer "robotoer (1 commits)")[![talentuno-official](https://avatars.githubusercontent.com/u/43640681?v=4)](https://github.com/talentuno-official "talentuno-official (1 commits)")[![TiMESPLiNTER](https://avatars.githubusercontent.com/u/598854?v=4)](https://github.com/TiMESPLiNTER "TiMESPLiNTER (1 commits)")[![timglabisch](https://avatars.githubusercontent.com/u/689269?v=4)](https://github.com/timglabisch "timglabisch (1 commits)")[![tolry](https://avatars.githubusercontent.com/u/259744?v=4)](https://github.com/tolry "tolry (1 commits)")[![dorumd](https://avatars.githubusercontent.com/u/7695281?v=4)](https://github.com/dorumd "dorumd (1 commits)")[![cxj](https://avatars.githubusercontent.com/u/446131?v=4)](https://github.com/cxj "cxj (1 commits)")

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/talentuno-official-composer-monorepo-plugin/health.svg)

```
[![Health](https://phpackages.com/badges/talentuno-official-composer-monorepo-plugin/health.svg)](https://phpackages.com/packages/talentuno-official-composer-monorepo-plugin)
```

###  Alternatives

[symfony/runtime

Enables decoupling PHP applications from global state

74798.8M1.0k](/packages/symfony-runtime)[drupal/core-composer-scaffold

A flexible Composer project scaffold builder.

5344.1M561](/packages/drupal-core-composer-scaffold)[drupal/core-project-message

Adds a message after Composer installation.

2124.7M203](/packages/drupal-core-project-message)[vaimo/composer-patches

Applies a patch from a local or remote file to any package that is part of a given composer project. Patches can be defined both on project and on package level. Optional support for patch versioning, sequencing, custom patch applier configuration and patch command for testing/troubleshooting added patches.

3014.6M25](/packages/vaimo-composer-patches)[sandersander/composer-link

Adds ability to link local packages for development with composer

98457.9k](/packages/sandersander-composer-link)[phpro/grumphp-shim

GrumPHP Phar distribution

294.7M340](/packages/phpro-grumphp-shim)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
