ocramius/package-versions
Fast, zero-I/O access to installed Composer package versions from composer.lock. Get dependency versions at runtime via PackageVersions\Versions::getVersion(), with versions compiled during install/update—ideal for building assets or artifacts based on dependency versions.
composer.lock during composer install/update, enabling O(1) version lookups at runtime. This aligns perfectly with Laravel’s need for low-latency dependency checks (e.g., feature flags, conditional logic, or compliance checks).composer.lock ensures consistency but requires adherence to Laravel’s standard Composer workflow (e.g., no dynamic require-dev packages in production).register() method to expose versions as a singleton service (e.g., app('package-versions')).php artisan package:versions command for debugging.PackageVersions\Versions in PHPUnit tests using Laravel’s mocking utilities (e.g., createMock()).composer.lock is regenerated mid-deployment (e.g., via composer install --no-scripts).post-install-cmd) to trigger version recompilation.Versions_composer_tmpX).PackageVersions classes or use a custom namespace.~2.11.0 if using PHP 8.4+ or upgrade Laravel to PHP 8.5+.composer.lock managed? (Manual updates, CI/CD, or dynamic composer install?)composer.lock vs. runtime) trigger alerts (e.g., Laravel Horizon)?PackageVersions\Versions as a bound service with a custom resolver:
$this->app->bind('package-versions', function () {
return new PackageVersions\Versions();
});
PackageVersions facade for fluent access:
use Illuminate\Support\Facades\Facade;
class PackageVersions extends Facade {
protected static function getFacadeAccessor() { return 'package-versions'; }
}
Blade::directive('packageVersion', function ($package) {
return "<?php echo PackageVersions::getVersion('{$package}'); ?>";
});
Usage: @packageVersion('laravel/framework')package:versions command to dump all versions to a file or cache:
php artisan package:versions:dump --format=json --output=versions.json
composer.installed event to recompile versions post-install:
Event::listen('composer.installed', function () {
$this->app['package-versions']->recompile();
});
optimize-autoloader: true.microtime before/after getVersion()).AppServiceProvider.composer.json to include post-install-cmd for version recompilation:
"scripts": {
"post-install-cmd": [
"Illuminate\\Foundation\\ComposerScripts::postInstall",
"@php artisan package:versions:recompile"
]
}
~2.11.0 for PHP 8.4+).~1.10.1 (PHP 7.4+) but may miss optimizations.optimize-autoloader: true is set in composer.json.composer install --no-scripts in production (use --scripts or post-install-cmd).php artisan config:cache) can memoize version data if accessed via service container.composer.lock is version-controlled and regenerated in CI/CD.composer.json and run composer install --optimize.AppServiceProvider before any version-dependent logic.Versions) and integration tests (real composer.lock).composer.lock hashes).ocramius/package-versions for PHP version drops (e.g., v2.12.0 drops 8.2/8.3).composer update may invalidate version data.composer.lock checks).php artisan package:versions:debug command to log raw composer.lock parsing.php artisan config:clear) if versions appear outdated.composer dump-autoload --optimize is run post-install.composer.lock is writable (rare, but possible in shared hosting).composer.lock updates).cache()->forget('package-versions')) during deployments.getVersion() latency with/without caching (target <1ms for critical paths).app('package-versions')->getVersion('laravel/framework'); // Pre-load
How can I help you explore Laravel packages today?