project.cljに:mainを書くとrefreshがコケる問題の解決法
clojure.tools.namespace.replという便利なライブラリがある。どのように便利かについては、他の方のブログ記事やスライドを参照。
[Clojure] tools.namespaceを利用したREPL上でのソースコードリロード - /home/matstani/weblog
clojure.tools.namespace.replを使うとき、project.cljに:main指定があるとrefresh関数がコケるという問題があった。
これは、c.t.n.rの問題ではなく、Clojure本体の問題で、AOT(Ahead of time)コンパイルされたコードをリロードできないと言うことだそうだ。そして、:mainで名前空間が指定されると、その名前空間(ファイル)は自動的にAOTコンパイルの対象となる。なお、AOTは、HerokuとうのPaaSでコードを走らせる際も問題となることがあるようだ。
この問題を解決するためには名前空間のAOT化を抑止すれば良い。
How to use ^:skip-aot to avoid problems when using ...
このように、名前空間の指定の前に :^skip-aot というmetadataを付加すればよいようだ(実験するときはlein cleanを忘れずに)。
これでSublimeREPLからショートカットキーひとつでリロード・ユニットテストが走るぞーわーい