このエントリーはGitアドベントカレンダーの九日目です。
昨日はaerealさんの「内容が空のファイルをインデックスに追加する」でした。git-add
の-N
オプション、知らなかったんですが使えそう。
新規ファイルに暫く書き込んだ後で「あ、git-add
しなくちゃ」って思うことが多いんです。そういう時に取り敢えず登録だけして、後で差分を見ながら他のファイルとまとめて整理してコミットできるようになる、というのは地味(失礼!)だけど強い。
さて、今日の話題は「ファイル変更を監視するプログラム」です。
例えばSCSSを使っている時、開発中はscss --watch
やcompass watch
でSCSSファイルを監視しながら作業していると思います(Rails以外はね)。ファイルを変更したらそれを検知して、コンパイルして、CSSを上書きしてくれる。
ところがGitでは、git-checkout
でブランチを切り替えると、一瞬でファイルの内容が変わってしまいます。それでもscss
はけなげに頑張ってSCSSを再コンパイルしてくれるのですがたまに混乱しちゃいます(キャッシュファイルと整合性がとれなくなる)。
なので、ブランチ切り替えのタイミングでscss
を再起動してしまいましょう。
もしかして? Sass::Plugin::Rack
SCSSファイルをCSSにして返すRackサーバーを立てて、CSSへのアクセスをリバースプロキシーすればいいのでは、というアイディアもありますが、それではアドベントカレンダーの当番をこなせげふんげふん、千行二千行オーダーのファイルではパフォーマンスに不安があるので見送りました。
方針
-
scss --watch
をデーモンとして起動 -
git-checkout
時にデーモンを再起動(post-checkoutフックを使う)
という方針で行こうと思います。
※ デーモンはsudo
を 付けずに 起動します。git-checkout
の度にパスワード入れるとかめんどいんで。
scss --watchをデーモンとして起動
まず自分のscss
コマンドを作ります。
require 'sass'
require 'sass/exec'
dir = File.expand_path('..', __FILE__)
argv = ['--watch', "#{dir}/sass:#{dir}/css"]
opts = Sass::Exec::Sass.new(argv)
opts.parse!
(Gitと関係無いので省略しますが、自分でscss
コマンドを作っておくと、コンパイルが失敗した時の通知などが設定できて便利です。もちろんCompassを使ってもいいです)
次にこれをデーモン化するスクリプトを作ります。RubyGemのDaemonsを使うので、無ければ
$ gem install daemons
でインストールしておきます。
#!/usr/local/bin/ruby
require 'daemons'
prog = File.expand_path('../scss', __FILE__)
Daemons.run prog
実行可能にします。
$ chmod a+x scssd
デーモンを起動しておきます。
$ ./scssd start
git-checkout時にデーモンを再起動
.git/hooks/post-checkoutファイルを作ります。
$(cd $(dirname $0)/../..;pwd)/scssd restart
実行可能にします。
$ chmod a+x .git/hooks/post-checkout
これで、git-checkout
した時に、scss
を再起動するようになります。git-merge
、git-pull
などについても同様に設定しておくといいでしょう。
次回予告
今日は、フックスクリプトの実用例(に見せ掛けたSCSS運用方法?)でした。
明日はGit Advent Calendar / June 当番カレンダーを作ったkyannyさんの担当です。