protonemedia / laravel-task-runner
编写类似于Blade组件的Shell脚本,并在本地或远程服务器上运行
Requires
- php: ^8.2|^8.3
- illuminate/process: ^10.0|^11.0
- spatie/laravel-package-tools: ^1.13.0
- spatie/temporary-directory: ^2.1
Requires (Dev)
- laravel/pint: ^1.0
- nunomaduro/collision: ^7.0|^8.0
- orchestra/testbench: ^8.0|^9.0
- pestphp/pest: ^2.0
- pestphp/pest-plugin-laravel: ^2.0
- phpunit/phpunit: ^10.4
Conflicts
- nesbot/carbon: <2.63
README
一个用于编写类似于Blade组件的Shell脚本,并在本地或远程服务器上运行的包。支持后台运行任务和测试断言。基于Laravel 10中的进程特性构建。
赞助我们
❤️ 我们自豪地通过开发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.php
和resources/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)。请参阅 许可文件 获取更多信息。