omakeもmakeも使わずに、Sphinxドキュメントの継続的ビルド

新年あけましておめでとうございます。昨年一年は自分の(体重の)成長を実感できて大変残念ですね。この野郎。今年一年は減量の方ももうちょっと頑張ろうな。俺。

というわけでタイトルの話です。既にSphinxドキュメントで「.rst」ファイルが更新されたら、自動的にビルドを走らせる方法は偉大なる先人達の手によってとっくに道が開拓されているのですが、あえてまた開拓したいと思います。というか他の方法を僕がちゃんと理解できなかったので、僕の知ってる一番簡単な方法でやってみました。

先人達の足跡

特にやり方が決まってるいる話ではないので、omakeが好きな人、Makefileだけでやりたい人とかは下記記事が参考になると思います。

watchmedo コマンドを使う

やり方は至って簡単です。「watchdog」というpythonモジュールに付属する「watchmedo」コマンドを使えば、
ファイルを更新したタイミングで、任意のコマンドが叩けるのでそれを利用して「make html」するだけです。

インストールはpipでできます。

pip install watchdog

インストールするとwatchmedoコマンドが使えるようなっているので、sphinxドキュメントのあるディレクトリまで行って
下記のようなコマンドを入力すればおkです。

watchmedo shell-command --patterns="*.rst" --recursive --command='make html' ./

簡単に説明すると「*.rst」にマッチするファイルを更新したら「make html」を実行するという事です。
「--recursive」は再帰的にディレクトリを辿って検知してくれます。ここでは「./」カレントディレクトリ
以下の「*.rst」ファイル全てが対象となっています。

僕はいつもこれをシェルスクリプトにして、いつでも実行できるようにしています。(内容はものによって多少違うけど)

「watchmedo」の素敵な所は、これさえ知っておけば「ファイル更新」を検知して「ふがふが」したいなんて時に
素早く実現できるので自分は割と重宝しています。

余談

  • watchmedoの 「--patterns」オプションに複数パターンを指定したい時は? => 「--patterns="*.rst; *.txt"」

追記(2012/01/05)

id:kuenshi さんから指摘を頂いたので追記。そもそも「watchコマンド」で定期的に「make html」を走らせれば良いと指摘をもらいました。

理由はkuenishiさんに指摘されたものをそのままのっけると、「ファイルのタイムスタンプを比較する機能自体はsphinx-buildの中に組み込まれていて、更新のないファイルのリビルドはありません。watchで定期的に空振りするのがエコじゃないと言われたらまあそうなんですが。」だからです。。。orz

リビルドしないのは知ってはいたけど、なんかファイル更新検知に捉われてて正直言われるまで気づかなかったですw
id:kuenshi さんありがとうございますm(_ _)m

僕は自分のMacに homebrew で watchをインストールしてみました。

brew install watch

実行するときはこれで終わりです。デフォルトだと2秒間隔なので、もうちょっと間隔空けたい場合は「-n (--interval)」オプションで調整できます。

watch make html