スポンサーリンク

Macのファイル更新監視ツールfswatchを使ってmarkdown等を自動コンパイル

はじめに

Coda2とAppleScriptの組み合わせで、ある程度ですが自由にファイルをコンパイルできるようになりました。今回は、ショートカットキーやメニューから選択しなくてもファイルが更新されたら(保存時に)自動的にコンパイルされるようにします。

fswatchとShell scriptを利用します。

ファイル監視fswatch

Macでファイルの更新監視ができるfswatchというツールを見つけました。

バイナリは含まれていないので自分でビルドする必要がありますが、terminal.appでmakeコマンドを実行するだけなので簡単です。生成されたfswatchファイルをuser/bin/に移動するか、シンボリックリンクをbinに置きます。

使い方は簡単です。

./fswatch /some/dir "echo changed"

/some/dir内のファイルが更新されると、echoが実行されます。

Shell scriptとfswatchで自動的にコンパイルする

次に紹介するGruntを使わずに試行錯誤した方法なので、あまり効率的ではありません。

watcher.sh


#!/bin/sh

cd `dirname $0`
fswatch ./markdown ./compile.sh

compile.sh


#!/bin/sh

# DATE=`/bin/date '+%Y%m%d%H%M%S'`

bakPath=../markdown/bak/

# 拡張子がmarkdownのファイルのみ取得
files=./markdown/*.markdown

for filePath in ${files}
do
	fileName=${filePath##*/}
	
	# 拡張子を削除
	fileBaseName=${fileName%.*}
	
	if [ ! -e ${bakPath}${fileName} ]
	then
		cp -fp ${filePath} ${bakPath}${fileName}
		kramdown ${filePath} > ../html/${fileBaseName}.html
	else
		if [ ${filePath} -nt ${bakPath}${fileName} ]
		then
			cp -fp ${filePath} ${bakPath}${fileName}
			kramdown ${filePath} > ./html/${fileBaseName}.html
		else
			echo ${filePath}' does not change.'
		fi
	fi
done

watcher.shのfswatchでmarkdownフォルダの監視が始まります。更新されたことはわかっても、どのファイルかはわかりません。そこで、一番簡単なのは、何も考えずにフォルダ内のファイルをfor文でコンパイルさせればいいのですが、あまりにも非効率なので、少しだけ工夫しています。

ファイルが更新されると、compile.shが実行されます。compile.shはソースの通りですが、bakフォルダに監視対象のファイルを複製しておき、それと更新時刻を比較して、更新されていれば、更新されたファイルの複製とコンパイル(私はkramdownを使っていますが、なんでも実行できます)を実行します。

ファイルの複製が必要なのと、ファイル数が多くなったときのパフォーマンスに問題がありそうですが、限定した使い方なら応用が効きそうです。前回のAntを実行させてもいいですね。

Grunt

fswatch+シェルスクリプトで問題なかったのですが、ファイル数が増えた時に負荷がかかりそうなので、Gruntに移行しました。

以前から気になっていたのですが、Node.jsが必要だったりと面倒そうなイメージがあったので避けていましたが、びっくりするほど簡単でした。インストーラがあり、何も考えずに使えるようになりました。

ファイル更新時にブラウザを自動リロードしてくれるlivereloadなど、便利なプラグインが豊富にあります。Codaの内蔵プレビューでは、CSSの更新や外部ツールでの更新に対応できないので、これは助かります。

使い方については、詳しく説明しているサイトが多くあるので割愛します。最初の設定は面倒ですが、一度環境を作ってしまえば、後の作業が捗ります。

おわりに

fswatch+shellscriptは、Gruntを使うようになったので、すぐお蔵入りになってしまいましたが、覚えておけば色々と応用が効きそうです。