2016-05-08 2 views
4

Как автоматически перезагрузить Clojure код?Как автоматически перезагрузить код Clojure?

Я смотрел the presentation. И там они используют технологию Clojure с горячей заменой, которая перезагружает код всякий раз, когда происходят изменения в исходные файлы. Я могу запустить код, но я не могу наблюдать эффект автоматической перезагрузки. Как можно перезагрузить код?

the source code.

+2

Вы пробовали [figwheel] (https://github.com/bhauman/lein-figwheel)? – jmargolisvt

+1

Я спросил [вопрос] (http://codereview.stackexchange.com/q/126376/82369) о пересмотре кода о моем рабочем процессе Clojure; вы можете найти это полезным. –

ответ

1

Есть много способов, чтобы перезагрузить код, в зависимости от ситуации:

  • Emacs/CIDER ярлыков перезагрузить файл. Вероятно, Rich делает что-то подобное. Также смотрите: How to reload a clojure file in REPL
  • смотреть файлы и перезагрузить код (figwheel для разработки внешнего интерфейса делает это, test plugins, а также ярлыки сидра специально для выполнения тестов, boot имеет watch задачу ...)
  • с промежуточным программным обеспечением для веба сервер вы используете (ring имеет ring.middleware.reload/wrap-reload for this, pedestal поставляется с one а также другими веб-сервера, как yada хорошо играть с компонентом)
  • component рабочий процесс работает также, есть пример автоматических пополняемых систем с holy-grail
2

(я не полностью повторно смотреть это видео, но эти заметки из моих наблюдений после пропуска через видео и сделать обоснованные предположения)

Из того, что я вновь наблюдал это видео, похоже, что Rich оценивает код в работающем реплике. Это позволяет ему изменять код, оценивать его и видеть другое поведение.

Многие редакторы имеют поддержку для оценки кода в буфере в реплике Clojure. Here - это документация по использованию CIDER с Emacs для интерактивного воспроизведения вашего кода.

Не относится к видео, о котором идет речь, если вы используете ring для веб-разработки. Вы можете использовать промежуточное программное обеспечение wrap-reload, чтобы ваш код автоматически перезагружался, когда файл был изменен, и запрос попадает в ваше веб-приложение. Это чрезвычайно полезно при разработке веб-приложения Clojure.

Для автоматической перезагрузки и выполнения ваших clojure.tests я рекомендую lein-test-refresh. Это подключаемый модуль Leiningen, который отслеживает ваш проект изменений файлов и когда что-то изменяет его, перезагружает и запускает ваши тесты. Если у вас есть тесты для вашего проекта, это значительно ускоряет разработку.

+0

Я использую lein-test-refresh самостоятельно, с большим успехом! Я часто добавляю код в vim на верхнем уровне моей программы (не внутри теста или функции), сохраняю файл, смотрю, что распечатывает в окне с Leiningen, редактирует, сохраняет снова, видит, что распечатывает, и так на. Я довольно быстро рисую этот материал, а затем просто завершаю его в 'defn', чтобы сделать его частью программы. –

0

Если вы не очень любите Emacs (я люблю Emacs, но эй не все) LightTable - очень хороший вариант для интерактивного программирования Clojure/ClojureScript.

Для разработки ClojureScript (Clojure, который скомпилирован в Javascript) LightTable и Figwheel - действительно хорошая пара.

На мой взгляд, LightTable имеет некоторые преимущества против Emacs (у меня никогда не было сидра, чтобы отлично работать с ClojureScript) для веб-сайта, LightTable - это в основном специализированная версия Chrome, потому что она построена поверх Electron.

Проверить эту документацию на странице Figwheel GitHub: Running Figwheel with LightTable:

LightTable + Fighweel

1

крепление Используется для управления запуском и остановкой компонентов. Например, в базовом веб-приложении вы хотите запустить db, прежде чем запустить веб-сервер.

Тогда в Emacs вы можете иметь:

(defun cider-repl-refresh() 
(interactive) 
(save-some-buffers) 
(with-current-buffer (cider-current-repl-buffer) 
(goto-char (point-max)) 
(insert (concat "(require 'clojure.tools.namespace.repl) " 
       "(clojure.tools.namespace.repl/refresh)")) 
(cider-repl-return)))