2015-02-05 3 views
4

Я новичок в кодировании Clojure и просмотрел ряд статей для создания Emacs для разработки.
Сама настройка работает так, как она была разработана, но я запускал сервер из сеанса Сидра и полностью убивал Emacs при изменении кода. Или мне нужно найти серверный процесс из сеанса оболочки и убить его оттуда. Это далеко не идеально.Clojure кодирование с Emacs и Cider

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 и убить процесс там ...

+0

Я предлагаю вам прочитать https://github.com/stuartsierra/component и смотреть это видео https: // WWW. youtube.com/watch?v=13cmHf_kt-Q, чтобы получить общее представление о том, как начать, остановить, перезагрузить код и запустить веб-сервер. – mavbozo

+0

Вы просмотрели https://github.com/clojure-emacs/cider#basic- использования и на быстрых клавишах, перечисленных там? Вероятно, вы просто захотите переопределить буфер ('C-c C-k') после изменения (или использовать' C-x C-e' для одной формы). Если вам действительно нужно перезапустить Clojure, вы можете остановить его ('C-c C-q') и перезапустить из Emacs (' M-x cider-jack-in'). Кроме того, 'server' - это простой var, а не функция, поэтому просто сервер будет возвращать объект сервера (он запускается через' -main', когда вы оцениваете '(defonce server ...)'. Наконец, вы хотите посмотрите на плагин 'lein-ring', который упростит ваш рабочий процесс. – schaueho

+0

Если вы новичок в Clojure, посмотрите эту главу на ebook _Clojure for the Brave and True_: http://www.braveclojure.com/basic-emacs/для пошагового простого руководства по установке Emacs и Cider. –

ответ

0

Вот большая часть ответа я просто дал в similar question:


Попробуйте функцию (refresh) в clojure.tools.namespace.repl имен:

функция обновления будет сканировать все каталоги на пути к классам для исходных файлов Clojure, прочитать их нс декларацию, построить график их деп и загружать их в порядке зависимости.

https://github.com/clojure/tools.namespace#reloading-code-usage

Как правило, мы добавим, что и некоторые другие полезные вещи в user имен, поэтому он загружается в РЕПЛ при запуске:

(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, затем добавьте следующее к вашему лейну project.clj файл:

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

Предполагая, что вы хотите запустить сервер причала и загрузите или перезагрузите его, когда вы измените его из emacs. Хотя уже предоставленный совет хорош, он может быть более сложным, чем вам нужно при начале работы. Мой совет состоит в том, чтобы воспользоваться некоторыми из шаблонов там для lein, которые будут настраивать среду по умолчанию и рабочий процесс для вас. Затем вы можете уточнить это значение по умолчанию, пока вы узнаете больше, пока не получите рабочий процесс, который вам подходит. Моя рекомендация будет начать witht по умолчанию compojure шаблон т.е.

lein new compojure my-project 

Это создает проект голых костей с основным кольцом и 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))) 

Средство промежуточного перезарядки приведет к перезагрузке вашего кода при его изменении. Вам не нужно будет перезагружать сервер причала, чтобы изменения вашего кода вступили в силу - просто перезагрузите страницу.

В терминальном периоде либо

lein ring server 

или

lein ring server-headless 

Это запустит сервер пристани прослушивает порт 3000. Затем внутри Emacs, вы можете просто открыть сидр Repl использовать время написав свой код. Вам не нужно будет перезапускать серверный процесс, если вы не внесете изменения в файл project.clj. То же самое с процессом сидра.

Затем, как только вам станет удобно, посмотрите на документацию лейн-кольца. Там вы найдете информацию о том, как настроить файл repl.clj в проекте. После того, как вы сделаете это, вы будете в состоянии сделать что-то вроде

lein repl 

, а затем из этого РЕПЛ, сделать что-то вроде

(start-server) 

, которая запустит сервер. Затем вы можете переключиться на emacs и вместо запуска cider-jack-in вы можете сделать cider-connect, который будет подключать то, что он уже выполняет, вместо того, чтобы начинать второй сеанс репликации. Позже, если вы решите также начать просмотр clojurescript, вы можете посмотреть некоторые из шаблонов по умолчанию для приложений clojure + clojurescript. Мне очень нравится фиолетовый и использовать реагент честно, поэтому я также нашел шаблон реагента неплохим.

Существует довольно много шаблонов lein, и мне очень полезно просто запустить их и посмотреть, что они делают. Затем я стараюсь, чтобы вишня выбирала функции/варианты, которые мне нравятся.

+0

Шаблон compojure для leiningen добавляет 'ring/ring-defaults' в пространство имен. В' ring-defaults' включена функция перезагрузки (я предполагаю, reload) .Таким образом, нет необходимости конкретно включать директиву require. – jr0cket

+0

Нет необходимости включать функцию «wrap-reload» в определение приложения, то есть в '(def app ,,,)'. В промежуточном программном обеспечении 'wrap-defaults' содержится функция перезагрузки изменений при сохранении файла .clj. Любые изменения, внесенные в вашу треску e, которые вызываются из 'app-routes' или функций, которые он вызывает (и т. д.), впрыскиваются в текущий REPL.Любые изменения вне этой функциональной цепочки, особенно добавление библиотек, потребуют перезагрузки сервера. – jr0cket

0

Что касается ClassCastException - сервер должен быть функцией 1 пар:

(defonce server (fn [request] (-main))) 
Смежные вопросы