ファイルを変更したら自動的にreloadする方法

ファイルの更新を監視して、変更されたらMozReplなFirefoxさんにreload指令を送る。

コンテンツのファイルをいじってて、いちいちF5するのがめんどいので。

reload指令を受理できるように

をインストール。

ツール→MozLab→Start Replで開始。

extensions.mozlab.mozrepl.autoStartをtrueにすれば、動きっぱなしにできるのかも。

4242でlistenしてるのはlocalhostだけなので、他のマシンからtelnetしたいときは、パケットリピータを使う。

例えばstoneを使って、

  • 4242宛てのパケットをlocalhost:4242にリピートする
  • ただし、接続を許可するのは10.6.25.201と10.6.25.202からのみ

とするときはこんな感じ:

stone -nr localhost:4242 4242  10.6.25.201 10.6.25.202

reload指定はこんなスクリプト (reload-firefox) で:

#!/bin/sh
[ $# -eq 1 -o $# -eq 2 ] || { echo 'usage: reload-firefox HOST PORT'; exit 1; }
host=$1
port=${2:-4242}

echo "reload: $host:$port"
cat <<EOF | nc $host $port
content.location.reload(true)
repl.quit()
EOF
echo

これで、10.6.25.20[12]なマシンから、

$ reload-firefox 10.6.25.100

すると、10.6.25.100で動いてるFirefoxにreloadがかかるはず。

ファイルの更新を監視

ファイル(複数指定OK)が更新されたら指定したコマンドを実行するスクリプトをこさえる (observe-mtime):

#!/usr/bin/env perl
use strict;
use warnings;
use Pod::Usage;
use Getopt::Long;
use File::Modified;

my $Interval = $ENV{INTERVAL} || 3; # sec
my $command;

Getopt::Long::Configure("bundling");
GetOptions(
    'command|c=s' => \$command,
    'help|h|?'    => sub { pod2usage() },
    ) or pod2usage;
my @files = @ARGV;

### @files
### $command

my $o = File::Modified->new(files=>[ @files ]);
my @changes;

while (1) {
    if (@changes = $o->changed) {
        ### @changes
        print qx{ $command };
        $o->update;
    }
    ### sleep: $Interval
    sleep $Interval;
}

__END__

=head1 SYNOPSIS

observe-mtime -c command file [file...]

=cut

これを10.6.25.201で動かす。

$ observe-mtime -c '~/bin/reload-firefox 10.6.25.100' foo.html bar.css baz.js

んで、foo.htmlをいじれば、数秒以内にFirefoxにreloadがかかる。


WindowsのFirefoxで確認しつつ、LinuxなマシンのEmacs+trampでリモートのWebサーバのファイルをいじってるんではげしく便利す。

追記

  • reload-firefoxで、「$# ==」を「$# -eq」に直しました。Perlとshをいったりきたりしてるとよく間違います><
  • id:ZIGOROu さんにMozRepl::Plugin::PageReloadというのを教えていただきました。カレーたべたらのんだらちょっと試してみたいと思います!

追記 2007-12-15