3

我有一个基于 Clojure 的聊天机器人,我以典型的 leiningen 方式启动它lein run。我想为这个应用程序添加一个前端,但不完全确定如何去做。通过阅读有关 compojure、lib-noir 和 ring 的文档,看起来标准的服务方式是使用lein ring server. 如果可能的话,我宁愿只用一个 lein 命令启动应用程序和前端。这是否涉及使用类似的东西手动启动服务器(可能在另一个线程中)(run-jetty handler {:port 3000}),或者有人可以推荐更好的方法吗?

4

1 回答 1

2

在您的案例中,您对“前端”的理解是什么?我看到了两种可能性。

第一个是当你的 Clojure 机器人完全独立并且有一些外部接口可以与之交互时。在这种情况下,您的前端将是通过此外部接口与机器人交谈的单独应用程序,实际上,在这种情况下,如果您想使用单个 lein 命令启动程序,您应该-main在您的 webapp 中使用显式函数,该函数将首先运行您的机器人和然后启动服务器。我不知道启动服务器的确切命令;你的对我来说看起来不错,但我想我在某处读到这种初创公司已被弃用......

另一种可能性是当您希望将 web 应用程序集成到机器人中时。在这种情况下,您只需以直接使用机器人命名空间的方式编写 webapp;不需要任何-main功能,您所要做的就是运行lein ring server命令。

第二个对我来说看起来更清楚,但这取决于你的机器人的整体架构。

更新。

我已经更深入地研究了 ring 和 leiningen 是如何协同工作的,似乎最简单的方法让你得到你想要的东西如下。首先,按照自述文件的指示安装lein-ring插件。 接下来,将您的配置类似于以下内容:
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文件中应该有其他选项(它们在我上面链接的自述文件中进行了描述)。:handler是您的主要 Web 应用程序处理程序(有关它是什么以及为什么需要它,请参阅 ring 文档)。:init应该是你的初始化函数。这正是您应该添加代码以启动您的机器人的地方。
最后,发出lein ring server命令来启动你的 webapp。:init这将首先调用您在 中指定的函数project.clj,然后启动您的机器人,然后启动您的 web 应用程序。

于 2013-01-13T08:07:53.467 回答