chh / bob
一个小巧且混乱的PHP项目构建自动化工具。
Requires
- php: >=5.3.3
- chh/fileutils: 1.0.*@dev
- chh/itertools: ~1.0
- chh/optparse: *@dev
- monolog/monolog: ~1.0
- pimple/pimple: ~1.0
- symfony/finder: ~2.0
- symfony/process: ~2.0
Requires (Dev)
- phpunit/phpunit: ~3.7
This package is not auto-updated.
Last update: 2024-09-14 12:54:41 UTC
README
你好世界
将此文件放入项目根目录下的 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有时不会重新生成: 只有当存档的实际源文件发生变化时,才会重新生成。)