在开发基于 compojure/ring 的应用程序时使用 emacs/cider 的正确方法是啥?

Posted

技术标签:

【中文标题】在开发基于 compojure/ring 的应用程序时使用 emacs/cider 的正确方法是啥?【英文标题】:What is the correct way to use emacs/cider while developing a compojure/ring-based application?在开发基于 compojure/ring 的应用程序时使用 emacs/cider 的正确方法是什么? 【发布时间】:2014-08-04 09:30:34 【问题描述】:

开发时使用 emacs/cider 的正确工作流程/途径是什么 一个基于 compojure/ring 的 clojure 应用程序?

我觉得我可以“附加”到我正在运行的 compojure/ring-process, 更改其代码,读取/更改其数据,但我不明白我该怎么做? 正确的方法是什么?

我要做什么?

lein new compojure my-project
cd my-project
lein ring server-headless

开发服务器现在运行。如果我更改项目中的文件,它们将自动重新加载。那很好。但我想要的是我附上 例如,直接到流程并更改其功能。

我知道这是可能的,但我不明白怎么做。

【问题讨论】:

【参考方案1】:

我不知道正确,但我会投入 2 美分。

我使用 immutant 启动我的 ring 项目,它在指定端口启动 REPL。我从M-x cider 开始苹果酒并连接到先前指定的端口。从那里我可以修改 REPL 中的内容。

我也见过其他人从 REPL 内部启动码头,虽然我从未尝试过。

【讨论】:

更具体一点:当您在 Emacs 中打开连接到正在运行的无头码头/环形应用程序的 REPL 并且您评估一个函数或重新评估整个缓冲区或加载一个文件,这些评估将直接在正在运行的应用程序中可见。【参考方案2】:

聚会有点晚了。但正如我刚刚处理同样的问题并发现了这个悬而未决的问题。答案可以在以下位置找到: lein ring server with nrepl doesn't honour cider-nrepl

基本上,使用 lein-ring 的插件版本 0.9.2 并添加到 project.clj 上的 :ring 配置中 :nrepl :start? true 并且有效

【讨论】:

【参考方案3】:

有两种主要方法可以做你想做的事。它们都不是特定于环服务器,甚至是网络服务器,它们都适用于任何 Clojure 项目。

以下两种方法都应该为您提供功能齐全的 REPL,可以完全控制重新定义正在运行的服务器中的功能,以及完整的 CIDER 功能(例如能够调试对服务器的 Web 请求)。

与通常使用 CIDER 一样,您可以使用 C-c C-k 重新加载更改的文件,这将重新定义您更改的任何功能。还有plenty of other keys 可以进行更精细的评估。


M-x cider-jack-in(或 C-c M-j)

作为documented on the manual,这将启动您的项目的流程并将REPL 连接到它。这不会为您调用任何函数(CIDER 不会这样做),但您可以通过调用 REPL 中的相应函数轻松启动您的网络服务器。如果有问题的函数是 -main 函数,您可以通过 M-x cider-run 调用它(如果您愿意,可以将其绑定到一个键)。


M-x 苹果酒连接

同样documented on the manual,您可以像往常一样从终端启动您的网络服务器,然后调用M-x cider-connect 在其中打开一个REPL。 (这是我前一阵子做的)。

【讨论】:

这个答案对cider-connect 有帮助,请确保您使用 nrepl 选项运行。对于戒指,你需要这个 option :nrepl :start? true :port 9000

以上是关于在开发基于 compojure/ring 的应用程序时使用 emacs/cider 的正确方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

Compojure/Ring:为啥与 cookie-store 的会话在服务器重新启动后无法幸存?

如何在 Clojure/Compojure/Ring 中将映射转换为 URL 查询字符串?

在开发基于组件/环的应用程序时使用emacs / cider的正确方法是什么?

基于libco的c++协程实现(时间轮定时器)

基于AM5728的OpenCL例程开发分享

爱奇艺网络协程编写高并发应用实践