2017-04-26 41 views
1

我非常奇怪的Lein的行爲:它不斷加載未知的舊代碼。Leiningen保持原來的defns

src目錄有類似src/service/api.cljsrc/user.cljsrc/service下的所有文件正在重新加載,但lein完全忽略了src/user.clj中的任何更改。

(ns user 
    (:require [ragtime.jdbc :as jdbc] 
      [ragtime.repl :as repl])) 
... 

(defn migrate [] 
    (repl/migrate (load-config))) 

即使我刪除migrate定義,REPL將它命名user,雷音將lein run -m user/migratelein clean後運行它,並不會加載與(load-file "src/user.clj")變化太大。

如何使其將我的更改加載到user.clj

回答

0

Lein只在源路徑目錄中查找代碼。如果您沒有任何指定,則假定爲src。在您的project.clj這將是建議的條目:

:source-paths ["dev" "src"] 

爲了能夠從REPL這會爲user.clj工作重裝代碼:

(ns user 
    (:require [clojure.tools.namespace.repl :refer (refresh refresh-all)] 
      [clojure.stacktrace] 
      [clojure.pprint :as pp])) 

;; 
;; To run open a REPL and: 
;; (reset) 
;; (core/migrate) 
;; Repeat those two commands after every source code change you make 
;; 
(defn reset [] 
    (refresh)) 

user.clj可以dev目錄下去。

你的問題的答案是我認爲user.clj應該很少更改,重新啓動JVM/REPL在更改後不是問題。經常更改的代碼應位於src目錄下,不應將其命名爲命名空間user。您通常使用的主要入口點代碼位於名爲core.clj的文件中。因此,您應該將user.clj文件的內容放入core名稱空間中,即放在名爲core.clj的文件中,該文件位於src之下。

+0

但'user.clj'已經在'src'下 – fevgenym

+2

'user'是一個特殊的命名空間,不適合像migrate這樣的輸入命令。嘗試將你的'user'重命名爲'core'。這將是一個更傳統的方法。 –