Добавить интерфейс веб-приложения в существующее приложение Clojure

У меня есть чат-бот на основе Clojure, который я запускаю обычным способом с lein run. Я хотел бы добавить интерфейс к этому приложению, но не совсем уверен, как это сделать. Из прочтения документации по compojure, lib-noir и ring кажется, что стандартный способ обслуживания - с lein ring server. Я бы предпочел просто запустить приложение и интерфейс с помощью одной команды lein, если это возможно. Будет ли это включать ручной запуск сервера (возможно, в другом потоке) с чем-то вроде (run-jetty handler {:port 3000}), или кто-нибудь может порекомендовать лучший подход?


person devth    schedule 13.01.2013    source источник


Ответы (1)


Что вы понимаете под «интерфейсом» в вашем случае? Я вижу две возможности.

Первый - это когда ваш бот Clojure полностью автономен и имеет внешний интерфейс для взаимодействия. В этом случае ваш интерфейс будет отдельным приложением, разговаривающим с ботом через этот внешний интерфейс, и действительно, в этом случае, если вы хотите запускать свои программы с помощью одной команды lein, вы должны использовать явную функцию -main в своем веб-приложении, которая сначала запустит вашего бота. а затем запустите сервер. Однако я не знаю точной команды для запуска сервера; ваш вариант мне подходит, но я думаю, что где-то читал, что этот вид стартапов устарел ...

Другой вариант - когда вы хотите, чтобы веб-приложение было интегрировано в бота. В этом случае вы просто пишете веб-приложение таким образом, чтобы оно напрямую использовало пространства имен бота; функция -main не требуется, и все, что вам нужно сделать, это запустить команду lein ring server.

Второй вариант мне кажется более понятным, но он зависит от общей архитектуры вашего бота.

Обновить.

Я более тщательно изучил, как кольцо и leiningen работают вместе, и мне кажется, что самый простой способ получить то, что вы хотите, заключается в следующем. Сначала установите lein-ring подключаемый модуль как его файл readme.
Затем настройте свой project.clj аналогично следующий:

(defproject your-project "0.0.1"
  :dependencies [...]
  ...  ; All other configuration
  :ring {:handler your-namespace.web/handler
         :init your-namespace.bot/init})

Видите ли, у вас должны быть дополнительные параметры в вашем project.clj файле (они описаны в файле readme, на который я ссылался выше). :handler - это ваш основной обработчик веб-приложений (см. Документацию по кольцу, чтобы узнать, что это такое и зачем он нужен). :init должна быть вашей функцией инициализации. Это именно то место, куда вы должны добавить код для запуска вашего бота.
Наконец, введите команду lein ring server, чтобы запустить ваше веб-приложение. Сначала будет вызвана функция, указанная вами как :init в project.clj, которая, в свою очередь, запустит вашего бота, а затем будет запущено ваше веб-приложение.

person Vladimir Matveev    schedule 13.01.2013
comment
Основной интерфейс - через чат. Веб-интерфейс в первую очередь предназначен для настройки и статуса бота. - person devth; 14.01.2013