At Spatie we've released a plethora of Laravel packages. Now that Laravel 5.5 has been released most of our packages will get a new (major) version. In this blogpost I'd like to explain how we handle new releases of the framework and what it means for our packages.
Preparing for release
Laravel has a bi-yearly release cycle. It doesn't follow semver. Breaking changes are often introduced in point releases. That's why our Laravel packages mostly have very conservative composer constraints on them so that they are not installable in future versions of the framework. Every half year we go through them all, make sure that they are compatible with the latest and greatest version of the framework and tag new releases. We try to do this as quickly as possible after a new stable Laravel release has been tagged.
In previous releases of Laravel we've waited working a new versions of our stuff until the newest version of the framework was publicly available. The rationale behind this was that even in the last days before Laravel's release breaking code may be introduced, so it's best to create compatible packages after the release. Looking at the past learns us that a few weeks before a new version of Laravel gets released the development version is already pretty stable. That's why this time around we created
laravel-55 branches to make our code compatible ahead of Laravel's release.
Laravel 5.5 has an awesome new feature called package auto-discovery. There's no need anymore to manually register service provides and facades. Laravel will now automatically do that for you. It does this by looking at a special
extra key in the
composer.json of a package. All our L5.5 compatible packages will support this feature.
Let's take a look at a small package of ours that utilises this: laravel-tail. That one provides an artisan command to tail the logs. The only thing you need to do in a Laravel 5.5 application is
composer require spatie/laravel-tail. The service provider gets registered automatically which in it's turn registers an artisan command in the kernel. You can just use the
php artisan tail command. It's that simple.
Leaving older framework versions behind
Laravel 5.5 is a new LTS release. Personally I'm not a big fan of the concept of LTS, but in this case, for some packages, I'm grabbing the opportunity to break compatibility with previous versions of Laravel so I can make use of new features introduced in Laravel 5.5. Examples are
laravel-collection-macros, ... which all are getting new major releases. Even though we're not going to support the older versions actively anymore, the old major versions should all be pretty stable. We won't release any new features for older versions of our packages, but we will still accept PRs for bugfixes for quite some time.
In the past we've named our config files
laravel-<package-name>. We're going to simplify that by dropping the
laravel- prefix. So
config/laravel-backup.php just becomes
Leaving packages behind
Laravel 5.5 contains many new features. Some of the features will replace things that we already had in place via our packages.
dump macros for instance. We've been using those already for a long time in our projects. We've included them in
v2 of laravel-collection-macros. Laravel now has
dump functions on the collection by default, no need to macro them anymore.
Laravel has this really sweet functionality to build up json reponses for your API. It does more or less the same than Fractal but in a more integrated way. For most projects I'm probably going to use Laravel's baked in solution, but I still plan on maintaining our popular laravel-fractal package for people who want to use it in their Laravel app.
We have a package called laravel-failed-job-monitor that can send you a notification whenever a queued job fails. Laravel Horizon is a new awesome looking dashboard for managing queued job. It can also send notifications when something goes wrong. We are probably going to use Horizon for all our future projects. That's why we are leaving our own laravel-failed-job-monitor behind.
I'm really happy that the entire functionality of two of our packages is now included in the framework. For these two we are not going to create a Laravel 5.5 version, but we'll still do maintainance on the current version:
- laravel-migrate-fresh: This package provides an artisan command that can rebuild your entire database. It does this by dropping all tables first and then running all up migrations. You don't need to write any
downmigrations. Our package triggered the work that resulted the
migrate:freshcommand being included in Laravel itself.
laravel-tinker-tools: When working with
tinkerit's kinda bothersome that you need to type the fully qualified class name. Wouldn't it be nice of you could just use the short class name? That's exactly what this package does. So instead of typing
App\Models\BlogPost::first()you can do
BlogPost::first(). The code of this package was ported to the
laravel/tinkerpackage. Laravel 5.5 ships with this feature out of the box.