Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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

masaru99
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした