ほぼPHPでGulpやGruntのようなタスクランナーを自作する | PHP | みどりのウェブ開発日記

ほぼPHPでGulpやGruntのようなタスクランナーを自作する

カテゴリ: PHP

記事投稿日: 2016年12月6日



今回は、サーバサイドのエンジニアとして、タスクランナーについて考えていたことをまとめてみました。
一時期、タスクランナーにはまったことがありました。
最初はGruntで、次はGulpでした。
どちらも素晴らしいのですが、少し不満もあったのです。

そもそもタスクランナーとは

まずタスクランナーについて。
これはコンパイルや、ファイルの結合、最適化、圧縮など、開発に伴う手続き(タスク)を自動化するツールです。

開発をする限り、どうしても発生する作業を省いてくれるわけです。
Web開発では、CSSのプリプロセッサのSASSのコンパイルだったり、スタイルシートやJavaScriptの結合、圧縮が主になります。

そのほか、PHPDocumentorだったり、APIの資料だったり、スタイルシートガイドという文書を作成することもできます。
こういうものが自動で作れると、チームでの作業がはかどります。
また、人間は忘れる生き物なので、未来への自分自身に向けての保険にもなります。

node.jsのライブラリはサーバサイドに比べるととにかく大きい

さて、本題です。
Gulpは、node.jsというフロントサイドのテクノロジーで動きます。
つまり、サーバサイドのPHPやRubyで作っていようが、「JavaScript」を書かないといけない訳です。

Gruntに比べると、Gulpのタスクは、jQueryのようなライブラリしかさわったことのない人間でも、理解できると思います。

さて、Gulpに慣れてくると、以下の問題に気付きました。

     

  • 基本的なタスクをそろえると、nodeのライブラリが100MBを優に超える
  • メインの言語とは関係のないところで結構注力しないといけない

PHPが好きな人は、コンパイルがなくて、どのプラットフォームでも導入でき、実行できる手軽さが気に入っていると思います。
そこに、タスクランナーです。

PHP、あるいはRubyで軽いアプリを頑張って作成しているのに、裏ではタスクランナーのファイルがどんどん巨大化しているのです。
アプリの一部として、なんだか気にくわない訳です。
どうでもいい人にはどうでもいいのでしょうが、ノートPCでも開発ができるようになった昨今、できるだけ軽い環境で作業したいものです。

そこで、探し回ることにしました。
PHPでタスクランナーを作れないか、と。
フレームワークのPhalconには、cssminやjsminという組み込み済みのアセットメソッドがあります。
しかし、これは毎回該当の画面にアクセスしなければ動かず、また、CSSやJS以外のものはできません。

他のフレームワークでも、似たり寄ったりのようです。
PHP(Laravel)製TaskRunner「Envoy」を試してみた

気になったのは「Robo」です。
まだ試してはいません。というのも、サンプルコードに載っていたのがコンパイル系ではなかったので。
また時間があれば試します。

PHPでもアセット作りはシンプルにできる

あとは自力で開拓するまで。
Packagistを漁ってみたところ、以下のツールを見つけました。

名前から分かると思いますが、その通りの機能を持つものです。
CSS、JSの圧縮、SASSのコンパイル、結合(concat)…。
Gulpの主力機能がみんなありますね。

ちなみに、すべてcomposerのコマンドひとつでインストールできる手軽さです。
最後のだけ、JSONで結合するファイルを記述します。

試したところ、上記3つは、指定したファイルを引数にして、返り値にコンパイルした文字列を返すものです。
シンプルです。
フォルダ内のファイルリストを抽出して、1件ずつ回す処理を書くと、いい感じになります。

問題は「監視」

さて、タスクランナーなので、ファイル監視が必要です。
これは、ファイルを編集した時、自動的にタスクを実行する機能です。
これが意外に面倒で、ざっと調べると、コマンドプロンプト、PowerShellなどのパワーを借りる必要があるようです。

By: Robert

もっとシンプルにしたい、と考えてみました。

そもそもnode.jsのGulpにファイル監視機能があるなら、node.jsでファイル監視の機能だけ提供しているライブラリがあるのでは? と気づきました。

node.jsのライブラリを探すと、やっぱりありました。
Chokidar」です。
これは、約1.3MBほど。これ単体で動くならまだ許せる範囲です。

修正を検知した瞬間、「php task.php」をたたかせると、PHPファイルを実行させることができました。
ただ、ワンテンポ遅れて動くようです。ファイルの指定の仕方はまだ調査が必要のようです。

真打登場 taskphp

さて、ここまで記事を書いてきて、さらに調査を進めると、Symphonyコンポーネントで、PHPのみで記述できるタスクランナーが、とうとう見つかりました。

taskphp

サンプルコードを見ればわかる通り、Gulpに大変近い書き方です。
ここに、本記事で見つかったライブラリを登録すれば、Gulpそのものの働きをしてくれそうです。

今後は、軽い案件は、composer でライブラリを入れて、Chokidarで高速かつ軽量に対応できそうです。
中規模の案件でも、taskphp で十分いけそうです。

きっとできる、PHPなら

最後に。
フロント側のテクノロジーはそれなりに素晴らしいので、これも時代の流れかと仕方なしに習得している感があります。
つまり、サーバサイドのエンジニアとして、PHPやRuby、Pythonを使っているのに、node.jsにここまで頭を切り替える必要があるのかな、という疑問です。
AngularJSや、PugのようなHTMLのコンパイラにふれると、静的コンテンツで無理やり動的な動きを実装している、という印象は、サーバサイドの人間なら誰でも感じてしまうのではないでしょうか。

要は、使いどころと、実際の仕事としてどれだけのものがあるか、で考えればいいのかなと、この記事を書いてみて、結論が出ました。

モバイル向けのアプリをMonacaなどで作りたければ、フロントはnode系で作り、バックエンドのAPIはサーバサイドで作ればいい。

また、実際の仕事として、ウェブアプリ開発では、別にサーバサイドの技術がすたれているわけでも何でもない状況なわけです。

そして、PHPなら何でもできるよ、という自信を今回得られることができました。
node.jsすごいね。でも、同じことはPHPなら(少なくとも、もっと手軽な大きさで)実現できるよ、と。

つくづく、PHPを選んで良かったなと思います。








コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA




トップに戻る