我有一个基于 Clojure 的聊天机器人,我以典型的 leiningen 方式启动它lein run
。我想为这个应用程序添加一个前端,但不完全确定如何去做。通过阅读有关 compojure、lib-noir 和 ring 的文档,看起来标准的服务方式是使用lein ring server
. 如果可能的话,我宁愿只用一个 lein 命令启动应用程序和前端。这是否涉及使用类似的东西手动启动服务器(可能在另一个线程中)(run-jetty handler {:port 3000})
,或者有人可以推荐更好的方法吗?
1 回答
在您的案例中,您对“前端”的理解是什么?我看到了两种可能性。
第一个是当你的 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 应用程序。