【问题标题】:Leiningen keeps old defns莱宁根保留旧定义
【发布时间】:2017-04-26 22:47:15
【问题描述】:

我对 Lein 的行为很奇怪:它一直在加载不存在的旧代码。

src 目录,其中包含src/service/api.cljsrc/user.clj 之类的内容。 src/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 会在执行lein clean 之后使用lein run -m user/migrate 运行它,并且也不会加载使用(load-file "src/user.clj") 的更改。

如何让它加载我对user.clj的更改?

【问题讨论】:

    标签: clojure leiningen


    【解决方案1】:

    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。您拥有的 main 入口点代码通常位于名为 core.clj 的文件中。所以你应该把你的user.clj文件的内容放在core命名空间中,即放在一个名为core.clj的文件中,该文件位于src下。

    【讨论】:

    • user 是一个特殊的命名空间,不适合像 migrate 这样的输入命令。尝试将您的 user 重命名为 core。那将是一种更传统的方法。
    猜你喜欢
    • 2012-04-08
    • 1970-01-01
    • 1970-01-01
    • 2011-05-01
    • 1970-01-01
    • 2011-04-23
    • 1970-01-01
    • 2020-07-01
    相关资源
    最近更新 更多