protonemedia/laravel-task-runner

编写类似于Blade组件的Shell脚本,并在本地或远程服务器上运行

1.4.1 2024-03-06 16:19 UTC

This package is auto-updated.

Last update: 2024-09-20 14:09:54 UTC


README

一个用于编写类似于Blade组件的Shell脚本,并在本地或远程服务器上运行的包。支持后台运行任务和测试断言。基于Laravel 10中的进程特性构建。

Latest Version on Packagist run-tests Total Downloads Buy us a tree

赞助我们

❤️ 我们自豪地通过开发Laravel包并将其免费提供给社区来支持社区。如果这个包为您节省了时间,或者您在专业上依赖它,请考虑赞助维护和开发,并查看我们最新的高级包:Inertia Table。跟踪问题和拉取请求需要时间,但我们乐于提供帮助!

安装

此包需要Laravel 10和PHP 8.2或更高版本。您可以通过composer安装此包

composer require protonemedia/laravel-task-runner

可选地,您可以使用以下命令发布配置文件:

php artisan vendor:publish --provider="ProtoneMedia\LaravelTaskRunner\ServiceProvider"

基本用法

您可以使用Artisan的make:task命令创建一个Task

php artisan make:task ComposerGlobalUpdate

这将生成两个文件:app/Tasks/ComposerGlobalUpdate.phpresources/views/tasks/composer-global-update.blade.php

一旦您将脚本添加到Blade模板中,您可以通过调用dispatch()方法在本地机器上运行它

ComposerGlobalUpdate::dispatch();

或者,如果您不想使用单独的Blade模板,您可以使用--class选项(或-c

php artisan make:task ComposerGlobalUpdate -c

这允许您在行内指定脚本

class ComposerGlobalUpdate extends Task
{
    public function render(): string
    {
        return 'composer global update';
    }
}

任务输出

dispatch()方法返回一个ProcessOutput实例,它可以返回输出和退出代码

$output = ComposerGlobalUpdate::dispatch();

$output->getBuffer();
$output->getExitCode();

$output->getLines();    // returns the buffer as an array
$output->isSuccessful();    // returns true when the exit code is 0
$output->isTimeout();    // returns true on a timeout

要与底层的ProcessResult交互,您可以调用getIlluminateResult()方法

$output->getIlluminateResult();

脚本变量

与Blade组件类似,Task类的公共属性和方法在模板中可用

class GetFile extends Task
{
    public function __construct(public string $path)
    {
    }

    public function options()
    {
        return '-n';
    }
}

Blade模板

cat {{ $options() }} {{ $path }}

您可以使用静态的make()方法创建Task的新实例

GetFile::make('/etc/hosts')->dispatch();

任务选项

您可以指定超时时间。默认情况下,超时基于配置值task-runner.default_timeout

class ComposerGlobalUpdate extends Task
{
    protected int $timeout = 60;
}

在后台运行

您可以后台运行一个任务

ComposerGlobalUpdate::inBackground()->dispatch();

这允许您将输出写入文件,因为在后台运行Task时,dispatch()方法不会返回任何内容。

ComposerGlobalUpdate::inBackground()
    ->writeOutputTo(storage_path('script.output'))
    ->dispatch();

在远程服务器上运行任务

task-runner配置文件中,您可以指定一个或多个远程服务器

return [
    'connections' => [
        // 'production' => [
        //     'host' => '',
        //     'port' => '',
        //     'username' => '',
        //     'private_key' => '',
        //     'private_key_path' => '',
        //     'passphrase' => '',
        //     'script_path' => '',
        // ],
    ],
];

现在您可以在调用其他方法之前调用onConnection()方法

ComposerGlobalUpdate::onConnection('production')->dispatch();

ComposerGlobalUpdate::onConnection('production')->inBackground()->dispatch();

任务测试断言

您可以通过调用fake()方法来防止任务运行,并在执行后进行断言

use ProtoneMedia\LaravelTaskRunner\Facades\TaskRunner;

/** @test */
public function it_updates_composer_globally()
{
    TaskRunner::fake();

    $this->post('/api/composer/global-update');

    TaskRunner::assertDispatched(ComposerGlobalUpdate::class);
}

您还可以使用回调进一步调查任务

TaskRunner::assertDispatched(function (ComposerGlobalUpdate $task) {
    return $task->foo === 'bar';
});

如果您对Task使用PendingTask进行类型提示,您可以验证配置

use ProtoneMedia\LaravelTaskRunner\PendingTask;

TaskRunner::assertDispatched(ComposerGlobalUpdate::class, function (PendingTask $task) {
    return $task->shouldRunInBackground();
});

TaskRunner::assertDispatched(ComposerGlobalUpdate::class, function (PendingTask $task) {
    return $task->shouldRunOnConnection('production');
});

要伪造部分任务,您可以调用带有类或类数组的fake()方法

TaskRunner::fake(ComposerGlobalUpdate::class);
TaskRunner::fake([ComposerGlobalUpdate::class]);

或者,您可以伪造除特定任务之外的所有内容

TaskRunner::fake()->dontFake(ComposerGlobalUpdate::class);

您还可以提供伪造的任务输出

TaskRunner::fake([
    ComposerGlobalUpdate::class => 'Updating dependencies'
]);

或者使用ProcessOutput类来设置退出代码

use ProtoneMedia\LaravelTaskRunner\ProcessOutput;

TaskRunner::fake([
    ComposerGlobalUpdate::class => ProcessOutput::make('Updating dependencies')->setExitCode(1);
]);

当您指定任务输出时,您还可以防止未列出的任务运行

TaskRunner::preventStrayTasks();

更新日志

请参阅 变更日志 获取更多关于最近更改的信息。

贡献

请参阅 贡献指南 获取详细信息。

其他Laravel包

  • Inertia Table:Inertia.js的终极表格,内置查询构建器。
  • Laravel Blade On Demand:Laravel包,用于在内存中编译Blade模板。
  • Laravel Cross Eloquent Search:Laravel包,用于在多个Eloquent模型中进行搜索。
  • Laravel Eloquent Scope as Select:停止在PHP中重复您的Eloquent查询作用域和约束。此包允许您通过将它们添加为子查询来重用您的查询作用域和约束。
  • Laravel FFMpeg:此包为Laravel提供与FFmpeg的集成。文件的存储由Laravel的文件系统处理。
  • Laravel MinIO Testing Tools:在MinIO S3服务器上运行您的测试。
  • Laravel Mixins:Laravel好工具的集合。
  • Laravel Paddle:支持webhooks/events的Paddle.com API集成Laravel。
  • Laravel Verify New Email:此包添加了对验证新电子邮件地址的支持:当用户更新其电子邮件地址时,它不会替换旧地址,直到新地址被验证。
  • Laravel XSS Protection:Laravel中间件,用于保护您的应用程序免受跨站脚本(XSS)攻击。它净化请求数据,并可以净化Blade echo语句。

安全性

如果您发现任何与安全相关的问题,请通过电子邮件 pascal@protone.media 联系,而不是使用问题跟踪器。

致谢

许可协议

MIT许可协议(MIT)。请参阅 许可文件 获取更多信息。