【问题标题】:How to run/debug compojure web app via counterclockwise (or la clojure)如何通过逆时针(或 la clojure)运行/调试 compojure Web 应用程序
【发布时间】:2013-03-04 18:08:00
【问题描述】:

我正在尝试用 compojure 编写我的第一个网络应用程序。我正在使用 ccw,我 File-New-Project, Clojure Project 并使用“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 上。

【问题讨论】:

    标签: clojure compojure counterclockwise la-clojure


    【解决方案1】:

    您可以通过以下步骤在 IntelliJ IDEA 和 La Clojure 上运行 Compojure/Ring 应用程序:

    1. 使用lein pom 命令从leiningen 的project.clj 生成pom.xml
    2. 像往常一样使用 IntelliJ IDEA 导入 maven 项目。您可能需要确保类路径中有 Clojure jar。
    3. 加载项目后,您可以使用工具 -> 启动 Clojure 控制台启动 Clojure REPL。
    4. 要将 Clojure 文件加载到 REPL,请选择工具 -> Clojure REPL -> 将文件加载到 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 方面,您可以在文件 -> 项目结构 -> 模块中添加它。

    此处提供了完整的示例(带有码头重新加载):https://github.com/tlipski/ganelon-demo - 使用 IDEA 完成开发并在 Heroku 上运行真实站点:http://ganelon.herokuapp.com

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

    1. 在 IntelliJ IDEA 中创建远程调试运行配置文件
    2. 在文件 -> 项目结构 -> 模块 -> [您的模块] -> Clojure facet -> JVM 参数字段中的 REPL 设置中从上述配置文件(例如 agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005)添加适当的 JVM 选项。
    3. 使用工具启动 REPL -> 启动 Clojure 控制台。
    4. 启动远程调试配置文件。

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

    【讨论】:

    • (require 'asdf.handler) (use 'ring.server.standalone) (serve asdf.handler/app) 是一个更简单的 compojure 测试文件。只需在开发依赖项中包含[ring-server "0.2.8"]
    • 当然,只是想让示例基于 Compojure,而不是仅 Ring。无论如何,我希望答案对您有所帮助,我还向blog.tomeklipski.com发布了有关该技术的详细教程@
    • 您的博客链接已失效,但我想您现在已经知道了。
    • blog.tomeklipski.com 在 Blogger 上运行,Blogger 的可用性非常好,但我认为可用性不是 99.9999% - 所以偶尔停机是可能的。我刚刚检查过,它对我来说可以正常工作,即使使用帖子的直接链接:blog.tomeklipski.com/2013/04/… 无论如何,随着 IntelliJ 的 Cursive 插件越来越受欢迎,这篇文章已经过时了 - 请参阅 cursiveclojure.com/eap.htmlcursiveclojure.com/userguide
    【解决方案2】:

    在开发 Ring 应用程序时,这里有一个非常适合我的秘诀:

    • 确保为您的项目正确配置了 leiningen 支持(如有疑问,请执行一次):
      • 在包资源管理器中,选择项目,然后调用上下文命令Leiningen > Reset configuration
      • 然后也调用Leiningen > Update dependencies 命令
      • 您应该会在您的项目中看到一个 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

    请注意,逆时针的未来版本将更多地与 Leiningen 2 集成,但就目前而言,开发ring 应用程序的本质使得如上所述引导事物并不那么痛苦,恕我直言

    【讨论】:

    • 输入(app) 时,我得到ArityException Wrong number of args (0) passed to: cookies$wrap-cookies$fn clojure.lang.AFn.throwArity (AFn.java:437)
    • 哦,是的,对不起:app 只是主处理程序,而不是服务器。您需要创建一个用于启动服务器的函数,例如 (defn start [] (run-jetty #'app {:join? false})) ,并且不要忘记向您的命名空间添加一个 require :(:require [ring.adapter.jetty :only [run-jetty]])。因此,您必须调用的是(start),而不是(app)
    • 几乎,我收到了Could not locate ring/adapter/jetty__init.class or ring/adapter/jetty.clj on classpath 错误,但后来我在compojure 的wiki 上找到了这个链接,下面的第二部分解决了它:github.com/ring-clojure/ring/wiki/Interactive-Development
    • 实际上回想起来,我认为如果我只是将 [ring] 添加到项目依赖项中(compojure 仅依赖于 [ring/ring-core])它会起作用。
    • 哦,是的,好的。抱歉,我还没有完成 compojure dev,但是直接 ring dev,所以我不知道 compojure 还没有将 ring.adapter.jetty 添加到依赖项中。那么现在使用 ccw 和 webapp dev 一切都好了吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-22
    • 1970-01-01
    • 2019-10-11
    • 2018-05-14
    • 1970-01-01
    • 2023-02-11
    • 1970-01-01
    相关资源
    最近更新 更多