我是Clojure编码的新手,我阅读了许多文章来设置Emacs以供开发。
安装本身按照设计工作,但我一直在运行来自Cider会话的服务器,并在进行任何代码更改时完全杀死Emacs。或者,我需要从shell会话中找到服务器进程,然后在那里终止它。这远非理想。
clojure-getting-started/web.clj
(defn -main [& [port]]
(let [port (Integer. (or port (env :port) 5000))]
(jetty/run-jetty (site #'app) {:port port :join? false})))苹果酒会话
clojure-getting-started.web> (defonce server (-main))启动服务器后,我将使用(server)函数获得以下错误:
1. Unhandled java.lang.ClassCastException
org.eclipse.jetty.server.Server cannot be cast to clojure.lang.IFn错误消息是有意义的,但是如何使用Emacs刷新我的代码库?
我想(并希望)有一个比在Emacs上启动shell会话并在那里终止进程更好的方法.
发布于 2015-02-08 01:11:18
假设您希望运行一个jetty服务器,并在从emacs中更改代码时让它加载或重新加载您的代码。虽然已经给出的建议是好的,但在开始的时候,它可能比你所需要的更复杂。我的建议是利用lein的一些模板,它将首先为您设置一个默认环境和工作流。然后,当您了解更多信息时,您可以改进此默认设置,直到得到适合您的工作流为止。我的建议是从默认的compojure模板开始,即
lein new compojure my-project这就创建了一个基本的基本项目,包括基本的环和组合库、lein插件以及一个简单的dev配置文件。
编辑src/my_project/handler.clj文件并添加ring.middleware.reload中间件。
(ns my-project.handler
(:require [compojure.core :refer :all]
[compojure.route :as route]
[ring.middleware.reload :refer [wrap-reload]]
[ring.middleware.defaults :refer [wrap-defaults site-defaults]]))
(defroutes app-routes
(GET "/" [] "Hello World")
(route/not-found "Not Found"))
(def app
(-> app-routes
wrap-reload
(wrap-defaults site-defaults)))包装-重新加载中间件将导致您的代码在修改后重新加载。您不需要重新启动jetty服务器才能使代码更改生效--只需重新加载页面即可。
在终端运行
lein ring server或
lein ring server-headless这将启动一个监听端口3000的码头服务器。然后,从内部emacs,您可以打开苹果酒回购使用时,编写您的代码。除非对project.clj文件进行更改,否则不需要重新启动服务器进程。苹果酒的过程也是一样。
然后,一旦你对此感到满意,就看一下莱茵戒指的文档。在这里,您将找到有关如何在项目中设置repl.clj文件的信息。一旦你这样做了,你就可以做类似的事情了
lein repl然后从内部做一些类似的事情
(start-server)会启动服务器。然后,您可以切换到emacs,而不是运行苹果酒插孔,你可以做一个苹果酒连接,这将连接到他已经运行爬虫,而不是启动第二个回购会话。稍后,如果您决定也开始查看clojurescript,您可以查看一些clojure+clojurescript应用程序的默认模板。我很喜欢摆设和使用试剂,所以我也发现试剂模板相当好。
有相当多的lein模板在外面,我发现它真的很有用,只运行他们,看看他们做什么。然后,我倾向于选择我喜欢的特性/选项。
发布于 2015-02-07 09:05:18
这是我刚才给similar question的大部分答案
尝试(refresh)命名空间中的clojure.tools.namespace.repl函数:
refresh函数将扫描类路径上的所有目录以查找Clojure源文件,读取它们的ns声明,构建它们的依赖关系图,并按依赖关系顺序加载它们。
https://github.com/clojure/tools.namespace#reloading-code-usage
我们通常会向user命名空间添加一些其他有用的内容,因此在启动时将其加载到REPL中:
(ns user
(:require [clojure.tools.namespace.repl :refer [refresh]]
[clojure.repl :refer [doc source]]
[clojure.pprint :refer [pprint pp]]
[midje.repl :as midje]
[clojure.stacktrace :as st]))为了使代码与主源和测试源分离,将其放在<project root>/dev/user.clj的文件中,然后将以下内容添加到lein project.clj文件中:
:profiles {:dev {:source-paths ["dev"]}}发布于 2015-02-15 14:21:52
关于ClassCastException -服务器需要有一个param函数:
(defonce server (fn [request] (-main)))https://stackoverflow.com/questions/28348974
复制相似问题