如何通过Counterclockwise(或La Clojure)运行/调试Compojure Web应用程序

7

我正在尝试用Compojure编写我的第一个Web应用程序。我正在使用CCW,我使用“文件-新建项目,Clojure项目”并使用“compojure” Leiningen模板。最终生成的project.clj看起来像:

(defproject asdf "0.1.0-SNAPSHOT"
  :description "FIXME: write description"
  :url "http://example.com/FIXME"
  :dependencies [[org.clojure/clojure "1.4.0"]
                 [compojure "1.1.5"]]
  :plugins [[lein-ring "0.8.2"]]
  :ring {:handler asdf.handler/app}
  :profiles
  {:dev {:dependencies [[ring-mock "0.1.3"]]}})

src/asdf/handler.clj看起来像这样:

(ns asdf.handler
  (:use compojure.core)
  (:require [compojure.handler :as handler]
            [compojure.route :as route]))

(defroutes app-routes
  (GET "/" [] "Hello World")
  (route/not-found "Not Found"))

(def app
  (handler/site app-routes))

我发现我可以使用命令行运行 lein ring server,但是我不知道如何在eclipse中运行它。当然,我希望不仅能够运行它,还能够调试它并设置断点等等。有没有办法在eclipse中做到这一点?如果不行,IntelliJ/La-Clojure呢?(我有点害怕emacs,但如果它非常简单,我会尝试的。)
或者,这不是compojure应用程序的典型开发过程吗?(如果不是,那是什么?只是运行 lein ring server 然后祈祷吗?)
如果这在Win7上有所区别,请告诉我。
2个回答

5
这是我在开发Ring应用程序时尝试过的一种方法:
  • 确保你已正确配置了leiningen,以支持你的项目(如果不确定,只需进行一次):
    • 在包资源管理器中,选择该项目,调用上下文命令Leiningen > 重置配置
    • 然后再调用Leiningen > 更新依赖项命令
    • 你应该在项目中看到一个Leiningen Dependencies虚拟节点,引用了项目的直接和传递依赖项
  • 选择asdf.handler文件,右键单击,然后选择Debug as > Clojure Application
  • 在编辑器中打开asdf.handler命名空间
  • 将光标留在编辑器中,输入Ctrl+Alt+N跳转到REPL,并同时将REPL的当前命名空间切换为asdf.handler
  • 通过键入(app) + Enter (如果光标不在行末,则键入Ctrl+Enter)来启动应用程序

现在你可以在编辑器和REPL之间导航。

  • 要将编辑器内容发送到REPL,请选择它,然后按Ctrl+Enter
  • 如果你在没有选择的情况下按下Ctrl+Enter,则整个“顶级表达式”(例如,一个defn)将被发送到REPL。
  • 要重新发送整个文件到REPL,请键入Ctrl+Alt+S
  • CCW特定的所有快捷键列表在这里:http://code.google.com/p/counterclockwise/wiki/EditorKeyBindingsFeatures

请注意,未来版本的Counterclockwise将更好地与Leiningen 2集成,但是就目前而言,开发ring应用程序的本质使得像上面描述的那样启动不是很痛苦,以我个人的看法。


当输入(app)时,我得到了ArityException错误,提示传递给cookies$wrap-cookies$fn的参数数量不正确(应为0),位于clojure.lang.AFn.throwArity (AFn.java:437) - lobsterism
哦,对不起:app只是主处理程序,它不是服务器。您需要创建一个启动服务器的函数,类似于(defn start [] (run-jetty #'app {:join? false})),并且不要忘记在您的命名空间中添加一个require:(:require [ring.adapter.jetty :only [run-jetty]])。因此,您必须调用(start)而不是(app) - Laurent Petit
我几乎遇到了 Could not locate ring/adapter/jetty__init.class or ring/adapter/jetty.clj on classpath 的错误,但后来我在 Compojure 的 wiki 上找到了这个链接,并按照第二部分解决了它:https://github.com/ring-clojure/ring/wiki/Interactive-Development。 - lobsterism
事实上,回想起来,我认为如果我只是将[ring]添加到项目依赖项中(compojure仅依赖于[ring / ring-core]),它就可以工作了。 - lobsterism
哦,好的。抱歉,我没有做过Compojure开发,只是直接使用Ring进行开发,所以我不知道Compojure没有将ring.adapter.jetty添加到依赖项中。那么现在你在使用ccw和webapp开发时一切都正常了吗? - Laurent Petit
顺便问一下,您对于在Clojure中使用Emacs有什么看法?相比使用CCW,您是否看到了任何优势? - lobsterism

3
您可以按照以下步骤在IntelliJ IDEA和La Clojure上运行Compojure/Ring应用程序:
  1. 使用lein pom命令从leiningen的project.clj生成pom.xml
  2. 像平常一样使用IntelliJ IDEA导入maven项目。确保您的类路径中有Clojure jar。
  3. 加载Clojure REPL,可通过选择Tools->Start Clojure Console来实现。
  4. 要将Clojure文件加载到REPL,请选择Tools -> Clojure REPL -> Load file to REPL。

完成上述步骤后,要启动Ring应用程序,只需加载调用ring.adapter.jetty/run-jetty的Clojure文件即可。

要在http://localhost:4004/上运行一个简单路由的代码如下:

(require 'compojure.core)
(require 'ring.adapter.jetty)

(ring.adapter.jetty/run-jetty
  (compojure.core/routes (compojure.core/ANY "/" [] "Hello world!"))
  {:port 4004 :join? false})

:join?选项很重要,如果设置为true(默认值),REPL将不会接受更多命令。你的路由通常会更加复杂,应该使用compojure.core/defroutes或其他方法。

你可以把这样的文件放在test路径下,这样在IDEA外运行项目时就不会加载它。如果你的模块中没有添加Clojure facet,可以在“File” -> “Project Structure” -> “Modules”中添加。

一个完整的示例(带有jetty reloading)在这里可用:https://github.com/tlipski/ganelon-demo - 开发使用IDEA进行,真实网站在Heroku上运行:http://ganelon.herokuapp.com

使用上述技术运行的Clojure应用程序也可以进行调试 - 只需:

  1. 在IntelliJ IDEA中创建远程调试Run配置文件
  2. 将来自上面配置文件的适当JVM选项(例如agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005)添加到“File” -> “Project Structure” -> “Modules” -> [your module] -> Clojure facet -> JVM Arguments字段中的REPL设置中。
  3. 使用“Tools” -> “Start Clojure Console”启动REPL。
  4. 启动远程调试配置文件。

之后,你可以添加断点,检查变量等。


1
(require 'asdf.handler) (use 'ring.server.standalone) (serve asdf.handler/app) 是 Compojure 的一个简单测试文件。只需要在开发依赖中包含 [ring-server "0.2.8"] 即可。 - lobsterism
当然,我只是想让这个例子基于Compojure,而不仅仅是Ring。无论如何,我希望这个答案能够帮到你,我还在http://blog.tomeklipski.com/上发布了详细的教程。 - Tomek Lipski
你的博客链接已经失效了,虽然我猜你现在已经知道了。 - lobsterism
blog.tomeklipski.com 运行在 Blogger 上,它的可用性相当不错,但我认为不可能达到 99.9999% 的可用性 - 因此偶尔会出现停机时间。我刚刚检查了一下,对我来说它可以正常工作,即使使用直接链接到帖子:http://blog.tomeklipski.com/2013/04/running-and-debugging-clojure-code-with.html 无论如何,随着 IntelliJ 的 Cursive 插件越来越受欢迎,这篇文章变得有点过时了 - 请参见 http://cursiveclojure.com/eap.html 和 http://cursiveclojure.com/userguide/。 - Tomek Lipski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接