2014-12-04 26 views
1

在開發過程中,我經常require一個名稱空間,然後發現,源文件具有防止它被編譯的錯誤:重新命名空間錯誤後如何重新加載命名空間到repl?

(require '[foo.bar :as fb]) 
CompilerException java.lang.RuntimeException: ... 

我修正這個錯誤後,我嘗試require,但我不能:

(require '[foo.bar :as fb]) 
CompilerException java.lang.Exception: namespace 'foo.bar' not found, compiling: ... 

我的解決辦法是殺死REPL並再次運行lein repl,但是這顯然不夠理想。

有沒有辦法清除以前失敗require的影響?

(爲什麼錯誤「namespace ... not found」?這對我沒有意義。源文件仍然存在,Clojure早一分鐘就能找到它 - 這就是我知道錯誤。)

+0

找不到命名空間,因爲它沒有成功加載。名稱空間不會自動重新加載,因爲'require'已經提醒說名稱空間是必需的。這與遞歸評估命名空間需要的邏輯有關,其中許多命名空間將需要相同的命名空間......因此,在構建需要加載的命名空間樹時,根據需要標記事物是非常有用的。 – noisesmith 2014-12-04 12:09:33

+0

感謝您解釋@noisesmith,以及提供我所需要的答案。 – Mars 2014-12-05 01:01:55

回答

5

require需要一個可選的:reload參數,強制重新載入更改,即使require已經運行。

(require '[foo.bar :as foo] :reload) 

在命名空間的初始加載時出現錯誤,或者如果你只是要加載的命名空間的新版本,這非常有用。

還有:reload-all用於加載該名稱空間的所有遞歸所需代碼。

相關問題