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で実行できます。