composer/metadata-minifier
Utility library for Composer 2.x repository metadata. Minifies package version arrays into diffs and expands minified metadata back to the original structure, reducing JSON size and improving transfer efficiency. Includes simple static minify/expand APIs.
Install the package via Composer:
composer require composer/metadata-minifier
For your first use case, minify an existing composer.lock file to reduce its size and noise:
vendor/bin/composer-metadata-minifier
This will overwrite the current composer.lock with a minified version. To test without modifying your lockfile, use the --output flag:
vendor/bin/composer-metadata-minifier --output=minified.lock
Compare the output with diff composer.lock minified.lock to see the reduction in metadata.
Add a script to your composer.json to automate minification in CI:
"scripts": {
"post-update-cmd": [
"@php vendor/bin/composer-metadata-minifier"
]
}
Trigger it in CI after dependency resolution (e.g., composer install). This ensures only minified lockfiles are committed.
Use a pre-commit hook (e.g., via Husky or pre-commit) to auto-minify composer.lock before commits:
#!/bin/sh
vendor/bin/composer-metadata-minifier
git add composer.lock
This prevents uncompressed metadata from being accidentally committed.
If your workflow relies on specific metadata (e.g., extra fields), preserve them via a config file:
vendor/bin/composer-metadata-minifier --preserve=extra
Or define a .composer-metadata-minifier.json config:
{
"preserve": ["extra", "source.sha"]
}
For Laravel projects, integrate minification into a custom Artisan command:
// app/Console/Commands/MinifyLockfile.php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use Composer\MetadataMinifier\MetadataMinifier;
class MinifyLockfile extends Command
{
protected $signature = 'lock:minify';
protected $description = 'Minify composer.lock';
public function handle()
{
$lockfile = file_get_contents('composer.lock');
$data = json_decode($lockfile, true);
$minified = MetadataMinifier::minify($data);
file_put_contents('composer.lock', json_encode($minified, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES));
$this->info('Lockfile minified!');
}
}
Register it in app/Console/Kernel.php and run:
php artisan lock:minify
source.sha, dist-sha256). Always:
composer update/install.composer.lock before minifying.composer.lock isn’t minified.diff composer.lock minified.lock
--preserve to retain critical fields (e.g., extra for custom scripts).php artisan config:clear
php artisan cache:clear
composer.lock in a monorepo, ensure minification doesn’t break shared dependencies.composer validate post-minification.MetadataMinifier to handle project-specific metadata:
use Composer\MetadataMinifier\MetadataMinifier;
class CustomMinifier extends MetadataMinifier {
protected function shouldPreserve($key) {
return parent::shouldPreserve($key) || in_array($key, ['custom.field']);
}
}
composer-normalize) via a custom script.vendor/bin/composer-metadata-minifier --output=tmp.lock && diff composer.lock tmp.lock || exit 1
How can I help you explore Laravel packages today?