soy-php/soy

专注于简洁语法和灵活实现的PHP任务运行器

0.2.2 2016-02-01 10:41 UTC

This package is not auto-updated.

Last update: 2024-09-14 18:20:32 UTC


README

Latest Stable Version Total Downloads Latest Unstable Version License

介绍

Soy是一款专注于简洁语法和允许灵活实现的PHP任务运行器。

有关更多信息,请参阅为什么选择Soy?部分。

任务

用法

使用composer将Soy包含到您的项目中

$ composer require soy-php/soy

使用composer包含所需的任务,Soy不包含任何默认任务。对于此示例,我们可以包含Gulp任务

$ composer require soy-php/gulp-task

然后在您的项目目录中创建一个recipe.php文件,并将您的任务放在那里。这是一个最简单的示例

<?php

$recipe = new \Soy\Recipe();

$recipe->component('default', function (\Soy\Gulp\RunTask $gulpTask) {
    $gulpTask->run();
});

return $recipe;

这是一个更高级的示例,使用自定义CLI参数等

<?php

$recipe = new \Soy\Recipe();

$recipe->cli(function (\League\CLImate\CLImate $climate) {
    $climate->arguments->add('verbose', [
        'prefix' => 'v',
        'longPrefix' => 'verbose',
        'description' => 'Verbose output',
        'noValue' => true,
    ]);
});

$recipe->prepare(\Soy\Gulp\RunTask::class, function (\Soy\Gulp\RunTask $gulpTask) {
    return $gulpTask->setBinary('/usr/local/bin/gulp');
});

$recipe->component('gulp', function (\Soy\Gulp\RunTask $gulpTask, \League\CLImate\CLImate $climate) {
    $verbose = $climate->arguments->defined('verbose');
    if ($verbose) {
        $climate->green('Running gulp');
    }

    $gulpTask
        ->setVerbose($verbose)
        ->run();
});

$recipe->component('default', null, ['gulp']);

return $recipe;

API

Soy的核心是Recipe,它有两个主要方法:preparecomponent

准备

准备可以用来为任何任务设置默认值,第一个参数是类名,第二个参数是一个闭包,它接受一个类实例作为第一个参数。请确保您始终返回对象。

$recipe->prepare(\Soy\Task\GulpTask::class, function (\Soy\Task\GulpTask $gulpTask) {
    return $gulpTask->setBinary('/usr/local/bin/gulp');
});

您可以有任意多的prepare方法,甚至为同一类。您还可以传递第三个参数来预置准备,而不是附加。

组件

组件可以用来执行您的任务,第一个参数是组件的名称,第二个参数是一个闭包(或null)用于执行,第三个参数是其他组件的依赖数组。

$recipe->component('gulp', function (\Soy\Task\GulpTask $gulpTask, \League\CLImate\CLImate $climate) {
    $verbose = $climate->arguments->defined('verbose');
    if ($verbose) {
        $climate->green('Running gulp');
    }

    $gulpTask
        ->setVerbose($verbose)
        ->run();
});

您可以在闭包的签名中放入任何内容,相应的对象将根据类型提示注入。

CLI

定义CLI命令有三种方式,每种方式适用于不同的情况。

如果您想引入全局参数

$recipe->cli(function (\League\CLImate\CLImate $climate) {
    $climate->arguments->add([
        'foo' => [
            'description' => 'foo',
            'longPrefix' => 'foo',
            'noValue' => true,
        ],
    ]);
});

如果您想将特定任务的参数添加到组件中

$fooComponent = $recipe->component('foo', function (\Soy\Task\FooTask $fooTask, \Soy\Task\BarTask $barTask) {
    $fooTask->run();
    $barTask->run();
});

$fooComponent->cli([\Soy\Task\FooTask::class, 'prepareCli']);
$fooComponent->cli([\Soy\Task\BarTask::class, 'prepareCli']);

您还可以使用流畅接口

$recipe->component('foo', function (\Soy\Task\FooTask $fooTask, \Soy\Task\BarTask $barTask) {
    $fooTask->run();
    $barTask->run();
})
    ->cli([\Soy\Task\FooTask::class, 'prepareCli'])
    ->cli([\Soy\Task\BarTask::class, 'prepareCli'])
;

如果您想添加您自己的组件特定参数

$fooComponent = $recipe->component('foo', function (\Soy\Task\FooTask $fooTask) {
    $fooTask->run();
});

$fooComponent->cli(function (\League\CLImate\CLImate $climate) {
    $climate->arguments->add([
        'foo' => [
            'description' => 'foo',
            'longPrefix' => 'foo',
            'noValue' => true,
        ],
    ]);
});

为什么选择Soy?

Soy的重点是让开发人员重新获得控制权。

PHP

Soy的配方是用纯PHP编写的,您不需要熟悉任何新的语言,我们也不会强迫您使用标记语言。这个决定的成果是,您不再受限于您能做什么。

任务

Soy的任务大多是CLI包装器,每个任务至少有一个不接收任何参数的run()方法。这意味着任务专注于做一件事,所有选项都通过setter传递。因为任务是CLI包装器,所以不存在奇怪的集成错误的风险,调试变得容易。

可重用性

我们在开发代码时都追求可重用性,Soy有两种方式来加强这种思维模式。

支持这一点的第一个支柱是准备任务的概念。任务准备是堆叠的,可以是附加或预置。这些准备将在Soy的引导阶段运行,让您能够操作任何任务。您可以准备的一个有趣的对象是CLImate,准备CLImate允许您添加必需的/可选的参数/标志,让您完全控制如何与您的任务运行器交互。

支持可重用性的第二个支柱是通过 run() 方法参数选择设置器,每个任务都通过设置器接受其选项,允许你在任务准备阶段设置默认值。你可以创建一个具有合理默认值的配方,在你的项目配方中要求它,并且只自定义一些像文件路径之类的东西。

输出

豆子不喜欢说话,它把说话的权力留给你。你可以在CLI任务上启用详细模式,以获取更多关于使用的命令行和命令输出的洞察,但当组件被执行时没有默认输出。你可以在你的组件中添加 CLImate 作为参数,并使用其惊人的输出函数来满足你的需求。