• Stars
    star
    104
  • Rank 330,604 (Top 7 %)
  • Language
    PHP
  • License
    MIT License
  • Created almost 13 years ago
  • Updated almost 11 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Hi I'm Bob! I'm a tiny and messy build tool for PHP projects

Bob, your friendly builder

Build Status


Hello World

Put this in a file named bob_config.php in your project's root:

<?php

namespace Bob\BuildConfig;

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

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

Run this on your shell:

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

What is Bob?

This is Bob. Bob is a lightweight project automation tool in PHP similar to Rake.

Bob can be used as general build tool, but really shines when used in PHP projects as you are capable of reusing existing Application Code and Libraries in your buildfiles.

How Bob compares to Pake:

  • Bob uses a set of namespaced functions for the DSL, so PHP 5.3 is a must. If you need 5.2.x support, look at Pake.
  • Bob's task definitions directly take a closure for the task's body, instead of performing magic with functions named run_<task name>.
  • Bob has no file finder similar to pakeFinder, if you need this just use the Symfony Finder.

How Bob compares to Phing:

  • Bob does not use XML config files to define tasks. I think build files should be written in the language used to write the project itself so the barrier to contribution to build files is as low as possible. Also I think it's quite hilarious to use XML for a DSL with logic and such.
  • Bob has nothing like plugins. To add new functions to Bob's DSL just put them into the Bob\BuildConfig namespace and require the file somehow at the beginning of your build file. Simply put: Bob's build configs are only PHP.
  • Bob has no rich set of provided tasks and I do not plan to add this. Bob is lightweight.

Getting Started

Install

Prerequisites

Bob needs at least PHP 5.3.2 to run.

If you plan to hack on Bob, please make sure you have set phar.readonly to Off in your php.ini. Otherwise you will have a tough luck creating a PHAR package of Bob.

Install into a Composer-enabled Project (recommended)

Add the chh/bob package to the require-dev section in your composer.json:

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

Then run composer install --dev.

You can invoke Bob with:

php vendor/bin/bob

or:

./vendor/bin/bob

System-wide install (Unix-like OS only)

To do a system-wide install, download either a Release or clone the Repository with:

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

To install all of Bob's dependencies download Composer and run composer install:

$ wget http://getcomposer.org/composer.phar
php composer.phar install

Then run php bin/bob install and you're done.

By default the bob command is created in /usr/local/bin. To change this set a PREFIX environment variable, the command is then created in $PREFIX/bin.

Prepare your project

You can output a usage message by running

$ php vendor/bin/bob --help

First run in your projects root directory Bob with the --init flag. This creates an empty bob_config.php with one example task:

$ php vendor/bin/bob --init

Bob loads your tasks from a special file named bob_config.php in your project's root directory. Bob also includes all files found in a directory named bob_tasks, in the same directory as your bob_config.php. Files loaded from bob_tasks are treated the same way as regular Bob configs.

It's important that you declare that this file belongs to the Bob\BuildConfig namespace with namespace Bob\BuildConfig;, otherwise the DSL functions are not available.


Hint: It doesn't matter if you're in a sub-directory of your project, Bob will find your bob_config.php by wandering up the directory tree.


Now let's define our first task. This task will output "Hello World":

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

Tasks are run by using their name as argument(s) on the command line:

$ php vendor/bin/bob hello

When Bob is invoked without tasks it tries to invoke the default task.

To set a task as default task assign the task as prerequisite of the default task:

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

You know, tasks should be self-documenting, you really don't want a manual for your build config or do you? Bob provides the desc function for that. Let's add some text to our task, which describes what the task is all about:

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

To view all tasks and their descriptions pass the --tasks flag:

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

To see more examples for how Bob can be used, simply look into Bob's bob_config.php. It contains all configuration to create Bob's build artifacts, for example the bob.phar and the composer config.

File Tasks

A file task is a special kind of task, which gets only run if either the target (the product of some operation) does not exist, or the prerequisites are newer than the target.

So file tasks are very handy if you've some artifacts which are generated from other files, and which you don't want to regenerate if nothing has changed.

For example: Let's write a task which concatenates three input files to one output file.

First we have to create the prerequisites:

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

Then put this into your 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);
});

Let's run this task:

$ php vendor/bin/bob concat.txt
Concatenating

This will result in a concat.txt file in your project root:

$ cat concat.txt
foo
bar
baz

Let's run it again, without modifying the prerequisites:

$ php vendor/bin/bob concat.txt

See it? The callback was not run, because the prerequisites were not modified.

Let's verify this:

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

The prerequisites of a file task are also resolved as task names, so they can depend on other file tasks too. Or you can put regular task names into the prerequisites, but then you've to be careful to not accidentally treat them as files when looping through all prerequisites.

Packaging tasks for reusability

Ever did write a collection of tasks which you want to put into a package and reuse across projects?

Enter Task Libraries.

All task libraries implement the \Bob\TaskLibraryInterface which defines two methods:

  • register(\Bob\Application $app): Is called when the library is registered in the app.
  • boot(\Bob\Application $app): is called just before the Bob is run on the command line. Register your tasks here.

Here's a small example which registers a test task which uses PHPUnit:

<?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";
    }
}

You can use task libraries by calling the register function within your build scripts:

<?php

namespace Bob\BuildConfig;

register(new TestTasks);

You will now see the test task when you run ./vendor/bin/bob --tasks.

Hacking on Bob

There are lots of ways to improve Bob, but the most useful for me is to simply submit Issues to the Issue Tracker.

Contributing Code

I'm using the Zend Framework Coding Standard in Bob and so should you when contributing code.

Actually I'm using a loose version of it, the notable differences are:

  • I'm treating the public keyword as optional in functions.
  • var is okay for defining public instance variables.

Documentation

The Code Documentation is all done with Tomdoc, though there isn't anything generated for now.

Testing

I'm not requiring unit tests for contributions, though functionality which affects the command line tool should be at least tried a couple of times.

This shouldn't prevent you from writing Unit Tests though. I'm using PHPUnit for this purpose. There's also a test task which runs phpunit (this handles the copying the phpunit.dist.xml to phpunit.xml too).

I'm recommending php-build for doing tests with multiple versions of PHP.

Building

When you've done some changes and want to regenerate the bob.phar, simply run Bob on itself:

$ php bin/bob.php

To run only the Test Suite:

$ php bin/bob.php test

(In case you wonder that the PHAR gets sometimes not regenerated: It's only regenerated when the actual source files for the archive change.)

More Repositories

1

phpenv

Thin Wrapper around rbenv for PHP version managment
Shell
571
star
2

heroku-buildpack-php

A more advanced PHP buildpack for Heroku, inspired by the Node.js buildpack
Shell
265
star
3

pipe

Put your assets into the pipe and smoke them.
PHP
122
star
4

sirel

Builder and Dumper for SQL Abstract Syntax Trees
PHP
37
star
5

jekyll-prismic

Add Prismic.io content to your Jekyll site
Ruby
31
star
6

cache-service-provider

A Cache Service Provider for Silex, using the doctrine/cache package
PHP
23
star
7

stack-honeypot

Inserts a trap for spam bots into responses.
PHP
22
star
8

jazz

Turns nested arrays into HTML.
PHP
21
star
9

eventemitter

A simple EventEmitter implementation in Go, using channels and Goroutines.
Go
20
star
10

optparse

Another Command Line Argument Parser
PHP
19
star
11

frozen-silex

Proof of concept, Converts your Silex Application to a static site.
PHP
19
star
12

kue

Generic interface to job queues for PHP projects.
PHP
18
star
13

Trek

Assists you on your journey through the mountainous areas of Database Schema Managment.
Shell
10
star
14

SimplePhar

[UNMAINTAINED] Compiles your Project to a PHAR (PHP Archive)
PHP
10
star
15

commander

Easy calling of system commands for PHP.
PHP
9
star
16

pod

a simple web server interface for PHP web apps, inspired by Rack.
PHP
9
star
17

itertools

Give iterator operations some love.
PHP
7
star
18

Underscore.php

[UNMAINTAINED] Collection of Utility functions in the spirit of Underscore.js
JavaScript
6
star
19

einhorn

A simple utility belt for using PHP with Einhorn.
PHP
5
star
20

httpfetch

A library for simple HTTP requests (using RingPHP)
PHP
5
star
21

pipe-silex

Pipe Extension for Silex
PHP
4
star
22

meta-template

Templating solution with adapters to many engines.
PHP
4
star
23

spark-http-utils

MOVED: Utilities for stacking and composing applications implementing HttpKernelInterface
PHP
4
star
24

phin

A simple HTTP Server which connects to applications through a Rack-like Protocol
PHP
4
star
25

cheatsheets

Various cheatsheets for stuff I do
4
star
26

Simple-CMS

[UNMAINTAINED] A very simple CMS, just put text files in the pages directory and you're off to go! (no Database required, depends on Zend Framework and Spark Web Framework)
PHP
4
star
27

eventor

A sane interface to PHP's libevent extension.
PHP
3
star
28

onestroke-icons

[UNMAINTAINED] A very simple icon pack primarly for web applications
Shell
3
star
29

livesyncd

Simple, Fast, One-Way, Sync Daemon, using SFTP — similar to the "Auto-Deployment" feature present in most IDEs
Go
3
star
30

Spark2

[UNMAINTAINED] Eine DSL für PHP Web-Applikationen
PHP
2
star
31

php-styleguide

PHP Styleguide for contributions to my projects.
2
star
32

shellwords

A lame port of Ruby's Shellwords.rb
PHP
2
star
33

amadeus

A simple generator for truly static Composer repositories. Consider this a Proof of Concept.
PHP
2
star
34

Spark-Web-Framework

[DEAD] A simple Framework extending the Zend Framework.
PHP
2
star
35

CHH.github.io

Personal blog and website
HTML
2
star
36

ooio

Object oriented IO for PHP.
PHP
2
star
37

funk

Minimal functional programming library for PHP
PHP
2
star
38

weblife1auth

[UNMAINTAINED] Weblife1Auth provides an adapter for Zend_Auth for log on to the Weblife1 API
PHP
2
star
39

superfeedr-ping

Simple service which pings Superfeedr when a Github web hook was triggered
PHP
2
star
40

Concatenator.php

[UNMAINTAINED] A simple port of Sprockets (https://github.com/sstephenson/sprockets) to PHP
PHP
2
star
41

git-einsatz-ooe

Vue
1
star
42

yuribike

JavaScript
1
star
43

gridsome-source-rss

RSS source for gridsome
JavaScript
1
star
44

Project-Template

This is the Template for all my Projects. There are many like it, but this one is mine.
PHP
1
star
45

fileutils

Some file related utility functions and variations of internal functions which take callbacks.
PHP
1
star
46

fswatch

Run a command everytime a file changes
Go
1
star
47

dotfiles

My dotfiles.
Shell
1
star
48

netchan

Yields socket connections on a channel
Go
1
star
49

Szene1Api

[UNMAINTAINED] Sehr einfache Bibliothek zum Zugriff auf das SZENE1 API für PHP 5.3+
PHP
1
star
50

Spark2_Quickstart

[UNMAINTAINED] Ein Startpaket für neue Spark2 Applikationen
PHP
1
star