PHP
タスクランナー
robo

PHP製タスクランナー「Robo」でsassコンパイルやMinifyなどを試す

PHP製のタスクランナー「Robo」がとても良さそうだったので、試した内容をメモ。PHPカンファレンス2017で@sizuhikoさんが発表されたスライドをみて導入してみました。
https://speakerdeck.com/sizuhiko/php-conference-2017

実際に動くまでの手順と使い方を覚え書きとして。
あらかじめcomposerが入っている必要があります。また、やりたいことによってcomposerの中身を追記する必要があるので、合わせて載せておきます。

1.インストール

composer.jsonを作る

composer.json
{
    "require": {
        "consolidation/robo": "1.*"
    }
}

composerインストールを実行

$ composer install

実行。バージョンやヘルプが出てくればインストール完了です。

$ ./vendor/bin/robo

2.タスクを設定

カレントにタスクファイルをつくって、そこにタスクを書いていきます。
まずはお約束のHelloWorldで試してみます。

RoboFile.php
<?php
class RoboFile extends \Robo\Tasks
{
    /**
     * あいさつ
     */
    public function hello()
    {
        $this->say("Hello World!");
    }
}

タスクファイルを書いたら実行してみましょう。

$ ./vendor/bin/robo hello

-> Hello World! と表示されたと思います。これでタスクが実行されました。ちなみにここで追加したタスクは、ヘルプにも出てくるようになります。では次に実用的なタスクを書いてみましょう。

3.よく使うタスクを実行してみる

シェルスクリプトを実行する

単純にシェルスクリプトを実行します。

RoboFile.php
    public function shell()
    {
        $this->_exec('touch Robo');
    }

キャッシュクリア

指定のディレクトリ内のファイルを削除します。

RoboFile.php
    public function clear()
    {
        $this->_cleanDir(['tmp/']);
    }

scssをコンパイルする

先にcomposerでライブラリを追加してcomposer updateしたあとにタスクを書いていきます。実行すると同じ場所にcssが作成されます。

composer.json
{
    "require": {
        "leafo/scssphp": "0.1.*",
        "consolidation/robo": "1.*"
    }
}
RoboFile.php
    /**
     * SCSSコンパイル
     */
    public function scss()
    {
      $this->taskScss([
        'test1.scss' => 'test1.css',
        'test2.scss' => 'test2.css'
      ])
           ->importDir('./')
           ->run();
    }

実行するとコンパイルされます。コンパイル対象はimportDirで指定します。この場合はカレントディレクトリです。

$ ./vendor/bin/robo scss

4.その他いろいろなタスクを実行

ファイルの結合

composer.json
{
    "require": {
        "consolidation/robo": "1.*"
    }
}
RoboFile.php
    /**
     * CSS結合(JSでも可能)
     */
    public function concat()
    {
      $this->taskConcat([
        'test1.css',
        'test2.css'
      ])
           ->to('test.css')
           ->run();
    }

test1.cssとtest2.cssをtest.cssに結合します

cssのMinify

composer.json
{
    "require": {
        "natxet/CssMin": "3.*",
        "consolidation/robo": "1.*"
    }
}
RoboFile.php
    /**
     * CSS・JSのMinity
     */
    public function minify()
    {
      $this->taskMinify('test.css')
          ->to('test.min.css')
          ->run();
    }

test.cssをコンパイルしてtest.min.cssとして吐き出します。ちなみにjavascriptでも全く同じことが可能です。

画像の圧縮

composer.json
{
    "require": {
        "consolidation/robo": "1.*"
    }
}
RoboFile.php
    /**
     * 画像圧縮
     */
    public function minifyimg()
    {
      $this->taskImageMinify('before_img/')
           ->to('after_img/')
           ->run(); 
    }

before_imgにある画像すべてを圧縮してafter_imgに吐き出します

ファイル変更監視

composer.json
{
    "require": {
        "leafo/scssphp": "0.1.*",
        "consolidation/robo": "1.*"
    }
}
RoboFile.php
    /**
     * ファイル監視(管理画面)
     */
    public function watch()
        {
      $this->taskWatch()
         ->monitor([
          './test/'
        ], function () {
           $this->scss();
         } )
         ->run();
    }

 上記の場合だと、test内のファイルを変更して保存された時点で検知して、scssメソッドを実行します。つまり、内容を書き換えたら自動的にcssにコンパイルしてくれます。

タスクをまとめて実行する

RoboFile.php
    /**
     * Task1
     */
    public function task1()
    {
      $this->say("task1");
    }

    /**
     * Task2
     */
    public function task2()
    {
      $this->say("task2");
    }

    /**
     * まとめて実行
     */
    public function all()
    {
      $this->task1();
      $this->task2();
    }

単純に他のメソッドを順番に読み込むだけです。処理したい順番に並べる必要があるので気をつけて下さい。たとえばminifyしてから結合したいのか、結合してからminifyしたいのか、、などなど。

あとがき

これでフロント周りをまとめてRoboに面倒見てもらえるようになりました。なによりnpmとかをいじらず、composerだけでインストールが済むので非常にシンプルになってスッキリしましたね。ちなみにテストなどもRoboで実行できます。