Перезагрузка кода/маршрутов Clojure — проблема с использованием символа вместо var

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

Я смог заставить это работать только с использованием var для маршрутов, а не фактических символов. Может кто-нибудь объяснить, если я делаю это неправильно? Если нет, то зачем нужна переменная?

(def app-handler
  (let [formats [:json-kw :edn :yaml-kw :yaml-in-html :transit-json :transit-msgpack]
        wrapped-api (wrap-restful-format #'routes/api-routes :formats formats)
        combined-routes (compojure.core/routes wrapped-api #'routes/html-routes)
        with-defaults (wrap-defaults combined-routes api-defaults)]
    (if (is-dev?)
      ; Development
      (wrap-reload with-defaults)
      ; Production
      with-defaults)))

(Примечание #'routes/api-routes и #'routes/html-routes выше).


person Brandon    schedule 14.04.2015    source источник
comment
Это связано с тем, что обработчик приложения закрывает ваши функции маршрута, и если вы не используете переменную, экземпляр сервера, предоставленный вашему обработчику приложения в качестве аргумента, не сможет увидеть обновления. См. этот ответ для более полного описания. и демонстрация.   -  person noisesmith    schedule 14.04.2015
comment
@noisesmith Спасибо за быстрый ответ! Другой ответ довольно хорош, я просто не знал, что искать. Будет ли использование var иметь какое-либо значимое влияние на производительность по сравнению с каким-либо другим методом, использующим значение без ссылок?   -  person Brandon    schedule 15.04.2015
comment
Переменная считается стандартным способом сделать это (по крайней мере, во время разработки).   -  person noisesmith    schedule 15.04.2015
comment
Если вы хотите ответить, я приму :)   -  person Brandon    schedule 15.04.2015


Ответы (1)


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

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

person noisesmith    schedule 15.04.2015