Introducing Laravel Task Runner: Write scripts like Blade Components and run them anywhere
After all the Splade announcements and developments of the past months, today marks the release of a new Laravel package! The latest and greatest version 10 of the Laravel framework comes with a brand new Process API - a wrapper around the famous Symfony component, which simplifies the execution of external processes:
$directoryContents = Process::run('ls -la')->output();
While the Laravel ecosystem has a package called Envoy that makes it easy to use the Blade template engine to define and run tasks, Laravel Task Runner takes a different approach. This new package allows you to write tasks as if they were Blade Components, providing a dedicated class and template view. It is built on top of the new Process API, enabling you to run tasks directly from your code without installing a separate binary like Envoy. Plus, it supports running tasks locally and on remote servers through an SSH connection.
Let's take a look at a simplified deploy script. With the new package, you can create a task with the Artisan CLI:
php artisan make:task DeployApp
This command generates a DeployApp.php
class in the app/Tasks
directory and a deploy-app.blade.php
template file in the resources/views/tasks
directory. Just like Blade components, public properties and methods are accessible in the template. For instance, you can make the repository branch and migration options variable:
use ProtoneMedia\LaravelTaskRunner\Task; class DeployApp extends Task{ public function __construct(public string $branch) { } public function databaseConnection() { return 'mysql'; }}
And then use them in the template:
cd /var/www/htmlgit pull origin {{ $branch }}php artisan migrate --database={{ $databaseConnection() }}
Tasks can easily be dispatched:
DeployApp::dispatch();
If you want to pass constructor parameters, you may use the static make()
method:
DeployApp::make('dev-new-feature')->dispatch();
In addition to running tasks locally, you can also dispatch them on a remote server and run them in the background. You can configure one or more remote connections in the config file.
DeployApp::inBackgronud()->onConnection('web')->dispatch();
Just like Laravel’s Process implementation, you can easily fake tasks and make assertions in your test suite:
TaskRunner::fake(); $this->post('/api/composer/global-update'); TaskRunner::assertDispatched(ComposerGlobalUpdate::class);
Here's another example of faking task output:
TaskRunner::fake([ ComposerGlobalUpdate::class => 'Updating dependencies']); $this->post('/api/composer/global-update'); TaskRunner::assertDispatched(ComposerGlobalUpdate::class, function (PendingTask $task) { return $task->shouldRunInBackground() && $task->shouldRunOnConnection('production');});
The package is fully open-source and available at Github, where you'll also find the full documentation.