symplify/monorepo-builder
Tools for PHP monorepos: scaffold a repo, merge package composer.json files into the root, validate shared dependency versions, bump inter-package constraints, propagate versions back to packages, and automate releases via a single monorepo-builder.php config.
Installation
composer require monorepo-php/monorepo --dev
Ensure PHP 8.2+ is used (or downgrade to symplify/monorepo-builder:^11.2 for PHP 8.1).
Initialize the Monorepo Run once to scaffold the structure:
vendor/bin/monorepo-builder init
This creates:
packages/ directory (default location for sub-packages).monorepo-builder.php (configuration file).First Merge
Merge all composer.json files from sub-packages into the root:
vendor/bin/monorepo-builder merge
Verify the root composer.json now includes all dependencies, scripts, and configurations.
First Release Test a release workflow:
vendor/bin/monorepo-builder release v0.1.0
This validates versions, updates composer.json, and generates changelogs.
monorepo-builder.php to customize paths, package naming conventions, and release behavior.vendor/bin/monorepo-builder list to see all available commands and their descriptions.return [
'paths' => [
'packages' => 'packages/*', // Customize package directory paths
'config' => 'monorepo-builder.php',
],
'github' => [
'user' => 'your-github-username',
'repository' => 'your-repo-name',
],
];
--dry-run flag for commands like merge or release to preview changes:
vendor/bin/monorepo-builder merge --dry-run
packages/ (e.g., packages/my-new-package).composer.json to the package with its dependencies and configurations.vendor/bin/monorepo-builder merge
composer require my-new-package
Adding Packages:
Use merge to include new packages in the root composer.json. The tool automatically handles:
require, require-dev).autoload, autoload-dev).scripts section).config, extra, etc.).--dry-run first to verify the merge output.Removing Packages: Manually delete the package directory and run:
vendor/bin/monorepo-builder merge --remove-unused
This cleans up unused dependencies from the root composer.json.
release command validates that all packages in the monorepo follow semantic versioning (SemVer) and are compatible. Configure version ranges in monorepo-builder.php:
return [
'version_ranges' => [
'packages/*' => '1.0.0|2.0.0', // Allow versions 1.x or 2.x
],
];
release command to bump versions across the monorepo:
vendor/bin/monorepo-builder release v1.2.0 --bump
This updates all package versions in composer.json files and generates changelogs.Full Release Workflow:
vendor/bin/monorepo-builder release v1.0.0
Steps performed:
composer.json versions.Custom Release Scripts:
Extend the release process by adding scripts to monorepo-builder.php:
return [
'release' => [
'scripts' => [
'post-release' => 'php scripts/deploy.php',
],
],
];
propagate to push root-level dependencies (e.g., dev dependencies) down to packages:
vendor/bin/monorepo-builder propagate
Configure which dependencies to propagate:
return [
'propagate' => [
'dev-dependencies' => ['phpunit/phpunit', 'symfony/debug'],
],
];
# Example GitHub Actions step
- name: Validate Monorepo
run: vendor/bin/monorepo-builder merge --dry-run
main:
- name: Release
if: github.ref == 'refs/heads/main'
run: vendor/bin/monorepo-builder release $(date +'%Y.%m.%d') --no-commit
monorepo-builder.php:
return [
'paths' => [
'packages' => ['src/*', 'lib/*'], // Include multiple directories
'config' => '.monorepo.php',
],
];
return [
'github' => [
'token' => getenv('GITHUB_TOKEN'),
'user' => 'your-org',
'repository' => 'your-repo',
],
];
release with --push to auto-publish tags:
vendor/bin/monorepo-builder release v1.0.0 --push
release command:
return [
'changelog' => [
'template' => file_get_contents('custom-changelog-template.md'),
],
];
merge by using --strategy:
vendor/bin/monorepo-builder merge --strategy=prefer-root
Strategies:
prefer-root: Prioritize root composer.json values.prefer-package: Prioritize package-level values.union: Merge arrays (default).Version Mismatches:
release with mismatched package versions (e.g., some packages at 1.0.0, others at 2.0.0) may fail validation.version_ranges in config to allow flexibility:
'version_ranges' => [
'packages/*' => '1.0.0|2.0.0',
],
vendor/bin/monorepo-builder validate to check versions before releasing.Circular Dependencies:
merge or propagate.--dry-run to identify cycles.Overwriting Configurations:
merge may overwrite root-level configurations (e.g., config, extra) with package-level values.--strategy=prefer-root to preserve root configurations or explicitly define which sections to merge.Git Ignore Conflicts:
init command may create .gitignore files that conflict with existing ones..gitignore files manually or customize the init template in monorepo-builder.php:
return [
'init' => [
'gitignore_template' => file_get_contents('custom-gitignore'),
],
];
PHP Version Constraints:
How can I help you explore Laravel packages today?