Clojure

Leiningen REPLを再起動せずにリフレッシュする

More than 3 years have passed since last update.

Clojureで開発するときにはREPLが重要、というか開発ライフサイクルの一部となるので、常にREPLを立ち上げた状態でファイルを編集して開発していきます。

ただ、ファイル編集するたびにREPLを再起動するのはあまりにも辛いので、再起動せずに編集内容を反映させる方法をまとめておきたいと思います。

namespaceをreloadする

一番シンプルな方法は編集したファイルのnamespaceを指定して再読み込みすることです。

利用方法

namespaceを再読み込みするときは以下のようにREPL内でコマンドを実行します。

my-app.repl=> (use 'my-app.edited.namespace :reload)
nil

tools.namespaceを使う

namespaceを直接reloadする方法でも良いのですが、これだと指定したnamespaceしかreload出来ないので複数のnamespaceに跨る編集を行っている場合はreload済とまだのものが混ざってしまうことが問題になります。

tools.namespaceというライブラリを使うとそこが解決され、プロジェクト内にあるクラスファイルすべてを一度に再読み込みしてくれます。

インストール

まずproject.cljの:dependenciesセクションに以下を追加して下さい。

project.clj
  :dependencies [[org.clojure/tools.namespace "0.2.7"]]

その後、依存関係を解決するため以下のコマンドを実行します。

$ lein deps

利用方法

プロジェクト内のすべてのnamespaceを再読み込みするときは以下のようにREPL内でコマンドを実行します。

; refreshコマンドを読み込んで、実行可能にする
my-app.repl=> (use '[clojure.tools.namespace.repl :only (refresh)]) 
nil
my-app.repl=> (refresh) ; すべてのnamespaceを再読み込み
:reloading (...) ; ()の中に読み込まれているnamespaceが表示される
:ok

おわりに

快適なREPL駆動開発を!