Использование информации cprop env в настройках swagger в проекте luminus
Я использую Swagger для предоставления API для программы доступа БД. Во время разработки у меня обычно работают 2 версии, версия dev и версия prod, которые я автоматически запускаю при входе в систему. Я хочу, чтобы на первой странице сваггера был виден другой заголовок, чтобы случайно не уничтожить мою живую базу данных. До сих пор я вручную редактировал поле заголовка в настройке swagger, но это подвержено ошибкам, я часто забываю изменить его перед запуском lein uberjar
построить версию Prod.
Настройка env кажется идеальным способом сделать это. Шаблон luminus lein уже использует карту env, созданную из конфигурационных файлов dev и prod, которая отлично работает, что позволяет мне автоматически указывать разные порты для двух сборок. Я добавил к ним запись, которая дает мне название, отличающееся в версиях prod и dev. Я могу видеть это из repl, но включение его в спецификацию чванства просто дает null
,
Это определение: swagger с самого начала моего файла photo-api.routes.services.clj:
(ns photo-api.routes.services
(:require [cheshire.core :as json]
[compojure.api.sweet :refer :all]
[image-lib.images :as ilim]
[image-lib.preferences :as ilpf]
[image-lib.projects :as ilpr]
[image-lib.write :as ilwr]
[photo-api.db.core :as db]
[photo-api.config :refer [env]]
[photo-api.routes.helpers.build :as build]
[photo-api.routes.helpers.keywords :as keywords]
[photo-api.routes.helpers.open :as open]
[photo-api.routes.helpers.photos :as photos]
[photo-api.routes.helpers.projects :as projects]
[ring.util.codec :refer [url-decode]]
[ring.util.http-response :refer [ok]]
[schema.core :as s]
[clojure.string :as str]))
(defapi service-routes
{:swagger {:ui "/swagger-ui"
:spec "/swagger.json"
:data
{:info
{:version "1.0.1"
;; Switch to correct title before lein uberjar
;; TODO Automate this so swagger page always shows dev or prod version
;;:title "Photo API"
:title (:title env)
:description "Access a mongo database containing details of photos"}}}}
Закомментировано: спецификация заголовка работает нормально, но (:title env)
call не делает, хотя это тот же самый вызов, который я могу успешно использовать из repl. Я полагаю, что карта env создана как часть photo-api.config, и из сообщений о запуске, когда я запускаю сервер, похоже, что он успешно запускается до http-сервера:
{:started
["#'photo-api.config/env"
"#'photo-api.db.core/db*"
"#'photo-api.db.core/db"
"#'photo-api.handler/init-app"
"#'photo-api.handler/app"
"#'photo-api.core/http-server"]}
user>
Это photo-api.config, без изменений по умолчанию от luminus:
(ns photo-api.config
(:require [cprop.core :refer [load-config]]
[cprop.source :as source]
[mount.core :refer [args defstate]]))
(defstate env :start (load-config
:merge
[(args)
(source/from-system-props)
(source/from-env)]))
и файл dev config.edn:
{:title "**** Photos Development API ****"
:dev true
:port 31999
;; when :nrepl-port is set the application starts the nREPL server on load
:nrepl-port 57251}
Я что-то упускаю здесь очевидное? Есть ли еще один шаг, необходимый для того, чтобы сделать карту env видимой для настройки swagger?
РЕДАКТИРОВАТЬ: изменение вызова от (:title env)
to (env: title) приводит к сбою подключения сидра с длинным сообщением об ошибке / трассировкой стека, которое включает в себя:
Caused by: java.lang.ClassCastException: mount.core.DerefableState cannot be cast to clojure.lang.IFn
Изменив это снова на (@env :title)
затем выдает такое же длинное сообщение об ошибке / трассировку стека, которое содержит:
Caused by: java.lang.ClassCastException: mount.core.NotStartedState cannot be cast to clojure.lang.IFn, compiling:(services.clj:29:23)
Таким образом, похоже, что env не запускается до тех пор, пока после него не поступит вызов из установки swagger. Я до сих пор не представляю, почему, когда cider-jack-in работал, он четко показывал состояние config.env, начиная с http-сервера. (см. выше)
1 ответ
Это выглядит как (defstate env)
это атом, который должен быть deref
редактор Маунт README указывает на тесты для некоторых примеров.
Вы можете попробовать (:title @env)
в service-routes
(defapi service-routes
{:swagger {:ui "/swagger-ui"
:spec "/swagger.json"
:data
{:info
{:version "1.0.1"
;; Switch to correct title before lein uberjar
;; TODO Automate this so swagger page always shows dev or prod version
;;:title "Photo API"
:title (:title @env) ;;;--------> UPDATED
:description "Access a mongo database containing details of photos"}}}}
РЕДАКТИРОВАТЬ --
Не атом. Смотрите эту проблему для той же ошибки разыменования, которая, вероятно, означает, что разыскивание не требуется.