LoginSignup
12
12

More than 5 years have passed since last update.

ファイルの変更を監視するプログラムと仲良くする

Posted at

このエントリーはGitアドベントカレンダーの九日目です。

昨日はaerealさんの「内容が空のファイルをインデックスに追加する」でした。git-add-Nオプション、知らなかったんですが使えそう。

新規ファイルに暫く書き込んだ後で「あ、git-addしなくちゃ」って思うことが多いんです。そういう時に取り敢えず登録だけして、後で差分を見ながら他のファイルとまとめて整理してコミットできるようになる、というのは地味(失礼!)だけど強い。

さて、今日の話題は「ファイル変更を監視するプログラム」です。

例えばSCSSを使っている時、開発中はscss --watchcompass watchでSCSSファイルを監視しながら作業していると思います(Rails以外はね)。ファイルを変更したらそれを検知して、コンパイルして、CSSを上書きしてくれる。

ところがGitでは、git-checkoutでブランチを切り替えると、一瞬でファイルの内容が変わってしまいます。それでもscssはけなげに頑張ってSCSSを再コンパイルしてくれるのですがたまに混乱しちゃいます(キャッシュファイルと整合性がとれなくなる)。

なので、ブランチ切り替えのタイミングでscssを再起動してしまいましょう。

もしかして? Sass::Plugin::Rack

SCSSファイルをCSSにして返すRackサーバーを立てて、CSSへのアクセスをリバースプロキシーすればいいのでは、というアイディアもありますが、それではアドベントカレンダーの当番をこなせげふんげふん、千行二千行オーダーのファイルではパフォーマンスに不安があるので見送りました。

方針

  1. scss --watchをデーモンとして起動
  2. git-checkout時にデーモンを再起動(post-checkoutフックを使う)

という方針で行こうと思います。

※ デーモンはsudo付けずに 起動します。git-checkoutの度にパスワード入れるとかめんどいんで。

scss --watchをデーモンとして起動

まず自分のscssコマンドを作ります。

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

でインストールしておきます。

scssd
#!/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ファイルを作ります。

post-checkout
$(cd $(dirname $0)/../..;pwd)/scssd restart

実行可能にします。

$ chmod a+x .git/hooks/post-checkout

これで、git-checkoutした時に、scssを再起動するようになります。git-mergegit-pullなどについても同様に設定しておくといいでしょう。

次回予告

今日は、フックスクリプトの実用例(に見せ掛けたSCSS運用方法?)でした。
明日はGit Advent Calendar / June 当番カレンダーを作ったkyannyさんの担当です。

12
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
12