簡體   English   中英

使用Emacs和Cider進行Clojure編碼

[英]Clojure coding with Emacs and Cider

我是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))

啟動服務器后,我將通過(server)函數獲得以下錯誤:

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


錯誤消息是有道理的,但是如何使用Emacs刷新我的代碼庫?
我想(並希望)有一種比在Emacs上啟動shell會話更好的方法並殺死那里的進程......

假設您想要的是運行jetty服務器並在從emacs中更改代碼時加載或重新加載代碼。 雖然已經給出的建議是好的,但它可能比你開始時需要的更復雜。 我的建議是利用lein的一些模板,這將為您設置默認環境和工作流程。 然后,您可以了解更多此默認值,直到獲得適合您的工作流程為止。 我的建議是從默認的compojure模板開始,即

lein new compojure my-project

這創建了一個簡單的項目,包括基本的ring和compojure庫和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)))

wrap-reload中間件將導致代碼在修改時重新加載。 您無需重新啟動jetty服務器即可使代碼更改生效 - 只需重新加載頁面即可。

在終端運行中

lein ring server

要么

lein ring server-headless

這將啟動一個偵聽端口3000的jetty服務器。然后從emacs中,您可以在編寫代碼時打開一個蘋果酒代碼來使用。 除非您對project.clj文件進行更改,否則無需重新啟動服務器進程。 與蘋果酒過程相同。

然后,一旦您對此感到滿意,請查看lein-ring文檔。 在那里,您將找到有關如何在項目中設置repl.clj文件的信息。 一旦你這樣做,你就可以做類似的事情

lein repl

然后從那個repl中做一些類似的事情

(start-server)

這將啟動服務器。 然后你可以切換到emacs而不是運行cider-jack-in,你可以做一個蘋果酒連接,這將連接他已經運行repl而不是開始第二次repl會話。 之后,如果您決定開始查看clojurescript,您可以查看clojure + clojurescript應用程序的一些默認模板。 我非常喜歡figwheel和使用試劑,所以我也發現試劑模板非常好。

有很多lein模板,我覺得運行它們非常有用,看看它們做了什么。 然后我傾向於選擇我喜歡的功能/選項。

以下是我剛才給出的類似問題的大部分答案:


嘗試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]))

要將該代碼與main和test源分開,請將其放在<project root>/dev/user.clj的文件中,然后將以下內容添加到lein project.clj文件中:

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

關於ClassCastException - 服務器需要是1個參數的函數:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM