chh/bob

一个小巧且混乱的PHP项目构建自动化工具。

v1.0.0alpha3 2013-01-16 09:10 UTC

README

Build Status

你好世界

将此文件放入项目根目录下的 bob_config.php 文件中

<?php

namespace Bob\BuildConfig;

task('default', ['hello']);

task('hello', function() {
	echo "Hello World!\n";
});

在您的shell中运行此命令

$ php composer.phar require chh/bob:~1.0@dev
$ vendor/bin/bob

什么是Bob?

这是Bob。Bob是一个轻量级的PHP项目自动化工具,类似于Rake。

Bob可以用作通用构建工具,但在PHP项目中使用时特别出色,因为您可以在构建文件中重用现有的应用程序代码和库。

Bob与Pake的比较

  • Bob使用命名空间函数集作为DSL,因此PHP 5.3是必需的。如果您需要5.2.x支持,请查看Pake。
  • Bob的任务定义直接接受闭包作为任务体,而不是通过名称为run_的函数进行魔法操作。
  • Bob没有类似于pakeFinder的文件查找器,如果需要这个功能,只需使用Symfony Finder

Bob与Phing的比较

  • Bob不使用XML配置文件来定义任务。我认为构建文件应该使用编写项目本身的语言来编写,以便尽可能降低对构建文件贡献的门槛。此外,我认为使用XML来定义具有逻辑等的DSL是非常滑稽的。
  • Bob没有插件。要向Bob的DSL添加新功能,只需将它们放入Bob\BuildConfig命名空间中,并在构建文件的开头以某种方式要求该文件。简单来说:Bob的构建配置仅是PHP。
  • Bob没有提供丰富的预定义任务,我也不计划添加这些。 Bob是轻量级的。

入门

安装

先决条件

Bob至少需要PHP 5.3.2才能运行。

如果您打算对Bob进行开发,请确保您已在您的php.ini中将phar.readonly设置为Off。否则,您在创建Bob的PHAR包时会遇到困难。

在Composer启用的项目中安装(推荐)

在您的composer.json中的require-dev部分添加chh/bob

{
    "require-dev": {
        "chh/bob": "1.0.*@dev"
    }
}

然后运行composer install --dev

您可以通过以下方式调用Bob

php vendor/bin/bob

./vendor/bin/bob

系统级安装(仅限Unix-like操作系统)

要进行系统级安装,下载发布版或使用以下命令克隆存储库

$ git clone git://github.com/CHH/bob.git
$ cd Bob

要安装Bob的所有依赖项,请下载Composer并运行composer install

$ wget https://getcomposer.org.cn/composer.phar
php composer.phar install

然后运行php bin/bob install即可完成。

默认情况下,bob命令创建在/usr/local/bin中。要更改此设置,请设置一个PREFIX环境变量,命令将创建在$PREFIX/bin中。

准备您的项目

您可以通过运行以下命令输出使用消息

$ php vendor/bin/bob --help

首先,在项目根目录中使用--init标志运行Bob。这将创建一个空的bob_config.php文件,并包含一个示例任务。

$ php vendor/bin/bob --init

Bob从位于项目根目录的一个特殊文件中加载你的任务,该文件名为bob_config.php。Bob还会包括位于与bob_config.php相同目录下名为bob_tasks的目录中找到的所有文件。从bob_tasks加载的文件将被视为与常规Bob配置文件相同。

重要的是,你需要使用namespace Bob\BuildConfig;声明此文件属于Bob\BuildConfig命名空间,否则DSL函数不可用。

提示:无论你在项目的哪个子目录中,Bob都会通过遍历目录树来找到你的bob_config.php

现在我们来定义第一个任务。这个任务将输出“Hello World”

task('hello', function() {
	println('Hello World');
});

可以通过在命令行中使用任务名作为参数来运行任务

$ php vendor/bin/bob hello

如果没有指定任务,Bob在调用时会尝试调用default任务。

要将任务设置为默认任务,将任务指定为default任务的前置条件

task('default', array('hello'));

你知道,任务应该是自文档化的,你真的不想为你的构建配置写一本手册吗?Bob为此提供了desc函数。让我们向我们的任务添加一些文本,描述这个任务是什么

desc('Prints Hello World to the Command Line');
task('hello', function() {
	println('Hello World');
});

要查看所有任务及其描述,请传递--tasks标志

$ php vendor/bin/bob --tasks
bob hello # Prints Hello World to the Command Line

要查看Bob如何使用的更多示例,只需查看Bob的bob_config.php。它包含创建Bob构建工件的所有配置,例如bob.phar和composer配置。

文件任务

文件任务是一种特殊类型的任务,只有在目标(某些操作的产品)不存在,或者前置条件比目标新时才会运行。

因此,如果你有一些由其他文件生成且不需要重新生成的工件,文件任务非常实用。

例如:让我们编写一个任务,它将三个输入文件合并为一个输出文件。

首先,我们必须创建前置条件

$ echo "foo\n" > file1.txt
$ echo "bar\n" > file2.txt
$ echo "baz\n" > file3.txt

然后将其放入你的bob_config.php

fileTask('concat.txt', array('file1.txt', 'file2.txt', 'file3.txt'), function($task) {
    println("Concatenating");
    $concat = '';

    foreach ($task->prerequisites as $file) {
        $concat .= file_get_contents($file);
    }

    @file_put_contents($task->name, $concat);
});

让我们运行这个任务

$ php vendor/bin/bob concat.txt
Concatenating

这将在你的项目根目录中生成一个concat.txt文件

$ cat concat.txt
foo
bar
baz

让我们再次运行它,而不修改前置条件

$ php vendor/bin/bob concat.txt

看吗?回调没有被运行,因为前置条件没有被修改。

让我们验证一下

$ touch file1.txt
$ php vendor/bin/bob concat.txt
Concatenating

文件任务的前置条件也会被解析为任务名,因此它们也可以依赖其他文件任务。或者你可以将常规任务名放入前置条件中,但此时你必须小心,不要在遍历所有前置条件时意外地将它们视为文件。

为可重用性打包任务

你是否曾经编写了一组任务,希望将它们放入一个包中并在多个项目中重用?

这就是任务库的作用。

所有任务库都实现了\Bob\TaskLibraryInterface,它定义了两个方法

  • register(\Bob\Application $app):当库在应用中注册时被调用。
  • boot(\Bob\Application $app):在Bob在命令行上运行之前被调用。在这里注册你的任务。

这里有一个小例子,注册了一个使用PHPUnit的test任务

<?php

use Bob\Application;
use Bob\TaskLibraryInterface;
use Bob\BuildConfig as b;

class TestTasks implements TaskLibraryInterface
{
    function register(Application $app)
    {}

    function boot(Application $app)
    {
        $app->fileTask("phpunit.xml", array("phpunit.dist.xml"), function($task) {
            copy($task->prerequisites->current(), $task->name);
        });

        $app->task("test", array("phpunit.xml"), function($task) {
            b\sh("./vendor/bin/phpunit");

        })->description = "Runs the test suite";
    }
}

你可以通过在构建脚本中调用register函数来使用任务库

<?php

namespace Bob\BuildConfig;

register(new TestTasks);

你现在会在运行./vendor/bin/bob --tasks时看到test任务。

在Bob上改进

有许多方法可以改进Bob,但对我最有用的是简单地向问题跟踪器提交问题。

贡献代码

我在Bob中使用了Zend框架编码标准,并且当贡献代码时你也应该使用它。

实际上,我使用了一个宽松的版本,显著的不同之处在于

  • 我将public关键字视为函数中的可选关键字。
  • var可以用来定义公开的实例变量。

文档

代码文档全部使用Tomdoc完成,但目前还没有生成任何内容。

测试

我不要求贡献者编写单元测试,但至少应该对影响命令行工具的功能进行几次尝试。

但这不应该阻止你编写单元测试。我使用PHPUnit来编写测试。还有一个名为test的任务会运行phpunit(这也处理将phpunit.dist.xml复制到phpunit.xml的过程)。

我推荐使用php-build来测试多个版本的PHP。

构建

当你进行了某些更改并想要重新生成bob.phar时,只需在Bob本身上运行Bob即可

$ php bin/bob.php

仅运行测试套件

$ php bin/bob.php test

如果你想知道为什么PHAR有时不会重新生成: 只有当存档的实际源文件发生变化时,才会重新生成。)