November 23, 2014

Laravel Elixirを試してみた

Laravel 5ではGulpが標準採用され、Laravel Elixirというタスクツールが併せて実装されるようです。

http://gulpjs.com/
https://github.com/laravel/elixir

ドキュメントを見てみると
* Sass,Less,CoffeeScript等のコンパイル
* CSS,JavaScriptの結合やminify
* PHPUnit,PHPSpec等の実行
* イベントやルーティングのスキャン(キャッシュ化)
といった、様々なタスクがサポートされています。

そんなLaravel Elixirを、Homesteadで試してみました。尚、Homesteadには最初からGulpがインストールされています。
http://laravel.com/docs/4.2/homestead

* Laravel 5もLaravel Elixirも現在開発中なので、今後もまだまだ変わる可能性はあるでしょう。

1. Homesteadのインストールと起動

http://madroom-project.blogspot.jp/2014/11/laravel-homesteadhomestead.html

2. Laravelプロジェクトの作成とLaravel Elixirに必要なパッケージのインストール

# Homesteadにログイン
$ homestead ssh

# Laravelプロジェクトの作成
# Laravel 5は現在開発中なので"dev-develop"を付けてインストールします
$ composer create-project laravel/laravel elixir-example dev-develop

# Laravel Elixirに必要なパッケージのインストール
$ cd elixir-example/
$ npm install
以下のコマンドは全てHomesteadの中です。

3. sassのコンパイルを試してみる

gulpfile.jsを適当に編集してみます。デフォルトではbowerと絡めてBootstrapを使用するための記述がありますが、今回は使わないので削除しています。
elixir(function(mix) {
    mix.sass('app.scss');
});
上記の'app.scss'は resources/assets/sass/app.scss を指しています。こちらも適当に編集してみます。
body {
  background: #000;
}
gulpコマンドでコンパイルしてみます。
$ gulp
[20:31:25] Using gulpfile ~/Code/elixir-example/gulpfile.js
[20:31:25] Starting 'default'...
[20:31:25] Starting 'sass'...
[20:31:27] Finished 'default' after 1.91 s
[20:31:27] gulp-notify: [Laravel Elixir]
[20:31:27] Finished 'sass' after 1.98 s
[20:31:27] gulp-notify: [Error in notifier] Error in plugin 'gulp-notify'
not found: notify-send
("gulp-notify"云々のエラーはなんだろう)

public/css/app.css としてコンパイルされました。
body {
  background: #000; }
gulp watch コマンドで、ファイル変更の度に自動でコンパイルすることもできます。
$ gulp watch

4. コンパイルするファイルにバージョン名をつける

gulpfile.jsを次のようにしてコンパイルしてみます。
elixir(function(mix) {
    mix.sass('app.scss')
        .version('css/app.css');
});
すると public/build/css/app-d8890e6e.css のように、ハッシュ付きのcssファイルが生成されました。

ビューファイルで以下のように書けば
<link rel="stylesheet" href="{{ elixir("css/app.css") }}">
public/build/rev-manifest.json を参照して
<link rel="stylesheet" href="/build/css/app-d8890e6e.css">
のようにHTMLを出力してくれます。

5. minifyする

$ gulp --production
でminifyしてくれました。

6. PHPUnitを実行する

gulpfile.jsを以下のようにすると、PHPUnitを実行して、テストが失敗すれば処理を停止、テストが成功すれば処理を継続。となりました。
elixir(function(mix) {
    mix.phpUnit()
        .sass('app.scss')
        .version('css/app.css');
}); 

7. 複数ファイルを結合してみる

scssファイルを適当に2ファイル用意してみます。
resources/assets/sass/foo.scss
.foo {
  background: #000;
}
resources/assets/sass/bar.scss
.bar {
  background: #fff;
}
gulpfile.jsを次のようにします。
elixir(function(mix) {
    mix.sass(['**/*.scss'])
        .styles('css/**/*.css')
        .version('css/all.css');
});
コンパイルすると、結合されたファイルが生成されました。
public/build/css/all-993ce219.css
.bar {
  background: #fff; }

.foo {
  background: #000; }
LessやCoffeeScriptのコンパイル、JavaScriptの結合やminify、PHPSpecの実行等も、似たような感じで実行できるはずです。(たぶん。)

以上のように、Laravel 5では、Laravel Elixirを用いて様々なタスクを簡単に実行できるようになるみたいですね。

gulpはタスクが非同期で実行されるが故に、実行順序で少しハマったことがあるのですが、その辺も吸収してくれると助かるなぁと思いました。

November 17, 2014

Laravel Homesteadをhomesteadコマンドで起動してみる

Laravelが標準的に提供している仮想環境"Homestead"がCLI化され、より簡単に起動できるようになったみたいなので試してみました。
http://laravel.com/docs/4.2/homestead

当記事は
* Mac OSX Yosemite
* VirtualBox 4.3.18
* vagrant 1.6.5
で確認しています。

1. composer global require コマンドでインストールします。
$ composer global require "laravel/homestead=~2.0"
2. ~/.composer/vendor/bin/homestead にパスを通します。以下、一例。
$ ln -s ~/.composer/vendor/bin/homestead /usr/local/bin/
3. homestead init コマンドを実行して初期化します。ホームディレクトリに".homestead"ディレクトリと、必要なファイルが生成されます。
$ homestead init
Creating Homestead.yaml file... ✔
Homestead.yaml file created at: /Users/xxx/.homestead/Homestead.yaml
4. homestead edit コマンドでHomestead.yamlがエディタで開かれました。
$ homestead edit
5. 以下、Homestead.yamlの設定項目の抜粋です。必要に応じて編集します。今回は、デフォルト設定のまま進めました。
authorize ... 使用する公開鍵
keys ... 使用する秘密鍵
folders (map/toを対にして複数指定できると思います。)
  map ... ホスト側のディレクトリ
  to ... ゲスト(Homestead)側のディレクトリ
sites (map/toを対にして複数指定できると思います。)
  map ... ベースURL
  to ... ドキュメント(WEB)ルート
6. デフォルト設定に対して必要なファイルを用意します。
$ mkdir -p ~/Code/Laravel/public
$ vim ~/Code/Laravel/public/index.php
~/Code/Laravel/public/index.php
<?php

phpinfo();
7. hostsも忘れずに編集しておきます。
$ sudo vim /etc/hosts
192.168.10.10 homestead.app # 追記
8. homestead up コマンドでHomesteadを起動します。
$ homestead up
9. http://homestead.app/ に正しくアクセスできれば成功です。

October 23, 2014

Backlogの課題を確認するChrome拡張機能を公開しました

Backlogの課題を確認するChrome拡張機能を公開しました。AngularJS(1.2)製です。

IssuesViewer For Backlog
https://chrome.google.com/webstore/detail/issuesviewer-for-backlog/ohgpfaebkmddhlpapnfjdoneoibhblkb


機能はざっと、以下な感じです。(0.0.7現在)

  • 自分の担当タスクを確認
  • 通知数を確認
  • マルチアカウント対応
  • 簡単な設定

"Setting"で、認証情報と検索条件を設定します。APIキーについては http://www.backlog.jp/help/usersguide/personal-settings/userguide2378.html を御覧ください。

ご意見ご要望は https://github.com/mamor/backlog-issues-viewer/issues まで。PR大歓迎です。

作った次の日にAngularJS 1.3がリリースされたので、テストケースを書きつつ1.3に上げる予定です。気が向き次第。

October 11, 2014

CentOSでcompass watchをSupervisorで永続化してOS起動時に自動起動する

以下、普通にインストールして設定する手順ですが、Vagrant環境に仕込んでチームで共有する。とかが現実的な使い方かなと思います。

Compassのインストール
$ sudo gem install compass
Supervisorのインストール
$ sudo yum install python-setuptools
$ sudo easy_install supervisor
/etc/supervisord.conf の作成(echo_supervisord_conf の内容に以下を追記)
[program:compass-watch]
command     = compass watch --poll --app-dir /path/to/app-dir/ -c /path/to/config.rb
autostart   = true
autorestart = true
/etc/rc.d/init.d/supervisord の作成
#!/bin/sh
#
# /etc/rc.d/init.d/supervisord
# sudo chkconfig --add supervisord
# sudo chkconfig --level 35 supervisord on
#
# chkconfig: - 64 36
# description: Supervisor Server
# processname: supervisord

. /etc/rc.d/init.d/functions

NAME="supervisord"
COMMAND="/usr/bin/supervisord"
PIDFILE="/var/run/$NAME.pid"
CONFIG="/etc/supervisord.conf"

start()
{
  echo -n $"Starting $NAME: "
  daemon $COMMAND -c $CONFIG --pidfile $PIDFILE
  [ -f $PIDFILE ] && success $"$NAME startup"
  echo
}

stop()
{
  echo -n $"Shutting down $NAME: "
  [ -f $PIDFILE ] && killproc $NAME || success $"$NAME shutdown"
  echo
}

case "$1" in

  start)
    start
  ;;

  stop)
    stop
  ;;

  status)
    status $NAME
  ;;

  restart)
    stop
    start
  ;;

  *)
    echo "Usage: $0 {start|stop|restart|status}"
  ;;

esac
/etc/rc.d/init.d/supervisord のサービス登録と自動起動設定
$ sudo chkconfig --add supervisord
$ sudo chkconfig --level 35 supervisord on

September 6, 2014

Laravel4.3(5.0?)のディレクトリ構成の変更メモ

4.3でなく5.0にする案も出ているみたいですが、どうなるかよくわからないので、とりあえず4.3と呼びます。

近々、4.3を使う気がするので、ディレクトリ構成の変更について調べてみました。時期的に、4.3正式リリースの少し前になると思うんですが、4.2からのアップグレードは面倒そうなので、4.3でスタートした方が良いかなぁ。と。

https://laracasts.com/series/whats-new-in-laravel-4-3 の動画が大変参考になりました。

尚、4.3はまだ開発段階なので、多少は変わる結構変わる可能性もあると思います。

まず、appディレクトリ。
app
├── Console ... app/commands に相応
├── Http
│   ├── Controllers ... app/controllers に相応
│   ├── Filters ... app/filters.php で指定していたフィルタ処理のクラス群
│   ├── Requests ... 新機能。1リクエストに対するバリデーションルールや認証ロジック等を持つクラスを実装する
│   └── routes.php ... app/routes.php に相応
├── Providers ... グローバル空間で行われていた色々な処理がプロバイダとしてまとめられた
└── User.php ... app/models/User.php に相応
appディレクトリはcomposer.jsonのPSR-4で指定されています。
"psr-4": {
    "App\\": "app/"
}
名前空間プリフィックスである "App" が嫌な場合は "app:name" で変更できます。
$ php artisan app:name Foo
動画にもあるように app/Http/Requests に実装するクラスは、コントローラメソッドにインジェクションして使うと便利そうです。コントローラメソッドへのインジェクションも、4.3からの新機能です。

次に、その他のディレクトリ。
bootstrap
├── environment.php ... 環境を決める処理がここに切り出された

config ... app/config に相応
├── filesystems.php ... 4.3で新たに組み込まれたファイルシステムに対する設定
├── namespaces.php ... appディレクトリ以下のクラスに対して使用される名前空間の設定

database app/database ... に相応

resources
├── lang app/lang ... に相応
└── views app/views ... に相応

storage app/storage ... に相応

4.2までappディレクトリにあった多くのディレクトリがプロジェクトルートに移動されています。appディレクトリに作成するファイルは、基本的には、アプリケーションを動かすためのクラスのみ。となった感じですかね。