我有一个基于Clojure的聊天机器人,我以lein run
的典型leiningen方式启动。我想在此应用中添加一个前端,但不完全确定如何去做。通过阅读有关compojure,lib-noir和ring的文档,看起来标准的服务方式是使用lein ring server
。如果可能的话,我宁愿用一个lein命令启动应用程序和前端。这会涉及用(run-jetty handler {:port 3000})
之类的东西手动启动服务器(在另一个线程中),还是有人可以推荐更好的方法?
答案 0 :(得分:2)
您在案件的“前端”下了解什么?我看到了两种可能性。
首先,当您的Clojure bot完全独立并且有一些外部接口与之交互时。在这种情况下,您的前端将是通过此外部接口与机器人交谈的单独应用程序,实际上在这种情况下,如果您想使用单个lein命令启动程序,您应该在webapp中使用显式-main
功能,这将是首先运行你的机器人,然后启动服务器。我不知道启动服务器的确切命令;你的看起来很好,但我觉得我在某个地方看到这种创业公司被弃用了......
另一种可能性是您希望将webapp集成到机器人中。在这种情况下,您只需以这样的方式编写webapp,即它直接使用bot的命名空间;不需要-main
函数,您只需运行lein ring server
命令。
第二个看起来更清楚,但这取决于机器人的整体架构。
<强>更新强>
我已经更仔细地研究了戒指和莱宁根如何一起工作,似乎最简单的方法让你得到你想要的东西如下。首先,安装lein-ring
插件作为its 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
文件中应该有其他选项(我们在上面链接的自述文件中对它们进行了描述)。 :handler
是您的主要Web应用程序处理程序(请参阅环文档,了解它是什么以及为什么需要它)。 :init
应该是您的初始化函数。 这正是您应该添加代码以启动机器人的地方。
最后,发出lein ring server
命令启动您的webapp。这将首先在:init
中调用您指定为project.clj
的函数,然后启动您的机器人,然后启动您的网络应用程序。