使用Emacs和苹果酒进行Clojure编码

使用Emacs和苹果酒进行Clojure编码,emacs,clojure,cider,Emacs,Clojure,Cider,我是Clojure编码新手,阅读了许多文章来设置Emacs进行开发。 设置本身按设计工作,但我一直在从Cider会话运行服务器,并在进行任何代码更改时完全杀死Emacs。或者,我需要从shell会话中找到服务器进程,并从那里杀死它。这远非理想 clojure入门/web.clj (defn -main [& [port]] (let [port (Integer. (or port (env :port) 5000))] (jetty/run-jetty (site #'ap

我是Clojure编码新手,阅读了许多文章来设置Emacs进行开发。
设置本身按设计工作,但我一直在从Cider会话运行服务器,并在进行任何代码更改时完全杀死Emacs。或者,我需要从shell会话中找到服务器进程,并从那里杀死它。这远非理想

clojure入门/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))
启动服务器后,我将使用
(服务器)
功能得到以下错误:

1. Unhandled java.lang.ClassCastException
   org.eclipse.jetty.server.Server cannot be cast to clojure.lang.IFn

错误消息是有道理的,但如何仅使用Emacs刷新代码库?

我认为(并希望)有一种比在Emacs上启动shell会话并终止该进程更好的方法…

以下是我刚才给a的大部分答案:


尝试
clojure.tools.namespace.repl
命名空间中的
(刷新)
函数:

refresh函数将扫描类路径上的所有目录以查找Clojure源文件,读取它们的ns声明,构建它们的依赖关系图,并按依赖关系顺序加载它们

我们通常会在
用户
名称空间中添加该名称和一些其他有用的内容,因此在启动时将其加载到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]))
要将该代码与主源代码和测试源代码分开,请将其放在
/dev/user.clj
的文件中,然后将以下内容添加到lein
项目.clj
文件中:

:profiles {:dev {:source-paths ["dev"]}}

假设您想要的是运行jetty服务器,并在您从emacs中更改代码时让它加载或重新加载代码。虽然已经给出的建议很好,但可能比开始时需要的要复杂。我的建议是利用lein的一些模板,这将为您首先设置一个默认环境和工作流。然后,您可以在了解更多信息时完善此默认设置,直到获得适合您的工作流。我的建议是从默认的compojure模板开始,即

lein new compojure my-project
这将创建一个包含基本ring和compojure库、lein插件以及一个简单的开发概要文件的基本项目

编辑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)))
wrap-reload中间件将导致在修改代码时重新加载代码。您无需重新启动jetty服务器即可使代码更改生效,只需重新加载页面即可

在终端运行中

lein ring server

这将启动jetty服务器,监听端口3000。然后,在emacs中,您可以在编写代码时打开一个cider repl来使用。除非对project.clj文件进行更改,否则无需重新启动服务器进程。苹果酒工艺也是如此

然后,一旦您对这一点感到满意,请查看lein ring文档。在这里,您可以找到有关如何在项目中设置repl.clj文件的信息。一旦你这样做了,你就可以做类似的事情了

lein repl
(start-server)
然后在repl中,做一些类似的事情

lein repl
(start-server)
这将启动服务器。然后,您可以切换到emacs,而不是运行苹果酒插孔,您可以执行苹果酒连接,它将连接到已经运行的repl,而不是启动第二个repl会话。稍后,如果您决定也开始查看clojurescript,您可以查看clojure+clojurescript应用程序的一些默认模板。我非常喜欢figwheel,并且使用了相当多的试剂,所以我也发现试剂模板非常好


有很多lein模板,我发现运行它们并查看它们的功能非常有用。然后我倾向于挑选我喜欢的功能/选项

关于ClassCastException-服务器需要是1个参数的函数:

(defonce server (fn [request] (-main)))

我建议您阅读并观看此视频,了解如何启动、停止、重新加载代码和启动web服务器。您是否查看了此处列出的键盘快捷键?您可能只想在更改后重新评估缓冲区(
C-C-k
)(或者对单个表单使用
C-x C-e
)。如果确实需要重新启动Clojure,您可以停止它(
C-C-q
)并从Emacs中重新启动(
M-x苹果酒插孔
)。另外,
server
是一个简单的变量,不是一个函数,因此只要
server
就会返回服务器对象(当您评估
(defonce server…)时,它是通过
-main
启动的)
。最后,你想看看
lein ring
插件,它将简化你的工作流程。如果你是Clojure新手,请看电子书《Clojure for the Brave and True:for the step by step easy guide for installing Emacs and Cider》。leiningen的compojure模板将
ring/ring defaults
作为一个名称添加ace require。
环默认值
包含一个重新加载功能(我假设其换行重新加载)。因此不需要特别包含require指令。不需要在应用程序的定义中包含
换行重新加载
功能,即在
中(def app,,,,,)
wrap defaults
中间件包含一个在保存.clj文件时重新加载更改的功能。从
应用程序路径调用的对代码所做的任何更改
或它调用的函数(依此类推)注入正在运行的REPL。此功能链之外的任何更改,尤其是添加库,都需要重新启动服务器。