• このエントリーをはてなブックマークに追加

ss-1315716199

はじめに

練習がてら,以前作った オレオレプレゼンツール で書かれているJavaScriptをCofeeScript で書いてみようかな,とか思い立ち,ただ,毎回コンパイするのもメンドイので,継続コンパイルとかその結果をGrowlに出したりとかできるような何かを,Perlスクリプトとシェルスクリプトで書きなぐってみました.

まぁどちらかと言えば,ただ組み合わせた感が強いですが!

なお,coffeeコマンドのみでも,-w オプションで継続コンパイルができることは,一応存じております.まぁ結局は,App::watcher 使ってみたかっただけです.

レシピ

このへんの準備が要ります:

使い方

% ./script/watch-coffee start
% ./script/watch-coffee stop
% ./script/watch-coffee restart

とりあえずは,特定のプロジェクト下にて,script ディレクトリを作って,そこにスクリプトを置いて使うことを想定しています.

あと,pidファイルを tmp ディレクトリ下に作るので,これも必要です.

こんな感じ

コンパイル成功:

ss-1315716059

コンパイル失敗:

ss-1315716199

ソースコード

シェルスクリプト

#!/bin/sh
 
ROOT=$( cd $(dirname $0)/../  &&  pwd )
PIDFILE=$ROOT/tmp/watch-coffee.pid
MODE=$1
 
 
_main()
{
    case $MODE in
        "start")
            __start
            ;;
        "stop")
            __stop
            ;;
        "restart")
            __stop
            __start
            ;;
        * )
            __start
    esac
    exit 0
}
 
 
__start()
{
    if [ ! -d $ROOT/tmp ]; then
        echo "no such directory: $ROOT/tmp"
        exit 1
    fi
 
    exec watcher \
        --dir $ROOT/coffee \
        -- \
        perl $ROOT/script/compile_coffee.pl $ROOT/coffee/slidegeso.coffee \
        > /dev/null 2>&1 &
 
    PID_WATCHER=$!
    echo $PID_WATCHER > $PIDFILE
}
 
 
__stop()
{
    kill -TERM $(cat $PIDFILE)
 
    if [ -f $PIDFILE ]; then
        rm $PIDFILE
    fi
}
 
 
__restart()
{
    __stop
    sleep .5
    __start
}
 
 
_main

Perlスクリプト

use 5.12.0;
use warnings;
use Cocoa::Growl ':all';
use File::Basename;
 
sub main {
    my ($target) = @_;
 
    growl_register(
        app           => 'CoffeeScript Compiler',
        notifications => [qw/ notif_success notif_failure /],
    );
 
    my $cmd = sprintf 'coffee -c -o js %s 2> /dev/stdout', $target;
    my $result = `$cmd`;
 
    my $title;
    my %params_notify;
 
    # failure
    if ( $result ) {
        $title = sprintf '%s: compile failed', (basename $target);
        %params_notify = (
            %params_notify,
            name        => 'notif_failure',
            title       => $title,
            description => $result,
            priority    => 3,
            sticky      => 1,
        );
    }
    # success
    else {
        $title = sprintf '%s: compiled', (basename $target);
        %params_notify = (
            %params_notify,
            name        => 'notif_success',
            title       => $title,
            description => 'ok.',
        );
    }
 
    growl_notify(%params_notify);
}
 
main(@ARGV);
__END__

おわりに

以上,CoffeeScriptファイルを継続コンパイルしつつ,その結果をGrowlに出すための何かを,Perlスクリプトとシェルスクリプトで書いてみたお話でした.

では,CoffeeScriptへの移植を始めてみます.