Использование информации cprop env в настройках swagger в проекте luminus

Я использую Swagger для предоставления API для программы доступа БД. Во время разработки у меня обычно работают 2 версии, версия dev и версия prod, которые я автоматически запускаю при входе в систему. Я хочу, чтобы на первой странице сваггера был виден другой заголовок, чтобы случайно не уничтожить мою живую базу данных. До сих пор я вручную редактировал поле заголовка в настройке swagger, но это подвержено ошибкам, я часто забываю изменить его перед запуском lein uberjar построить версию Prod.

Настройка env кажется идеальным способом сделать это. Шаблон luminus lein уже использует карту env, созданную из конфигурационных файлов dev и prod, которая отлично работает, что позволяет мне автоматически указывать разные порты для двух сборок. Я добавил к ним запись, которая дает мне название, отличающееся в версиях prod и dev. Я могу видеть это из repl, но включение его в спецификацию чванства просто дает null,

Снимок экрана HTML-страницы Swagger

Это определение: 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"}}}}

РЕДАКТИРОВАТЬ --

Не атом. Смотрите эту проблему для той же ошибки разыменования, которая, вероятно, означает, что разыскивание не требуется.

Другие вопросы по тегам