gpt4 book ai didi

clojure - 从我的应用程序中启动 REPL

转载 作者:行者123 更新时间:2023-12-02 16:12:47 25 4
gpt4 key购买 nike

假设我在工作中实现了一些个人计算的功能。我想构建一个 .jar (uberjar),我的同事也会在 REPL 中使用它,例如:

megacorpcalcs.core=> (+ 2 2)
4
megacorpcalcs.core=> (salary 8 0.4)
666$

我应该输入什么代码才能在 .jar 启动时启动 REPL?

最佳答案

编辑:在您发表评论后,我将此答案分为 2

<强>1。使用 REPL 运行 uberjar

创建你的 uberjar,并启动它:

java -cp /path/to/your/application-X.Y.Z-standalone.jar clojure.main -i @your_application/foo.clj -r

我必须添加 -i 参数并将其指向我的 clj 文件之一,以便让项目中的任何类实际加载到 repl 中。可能有更好的方法来做到这一点,但我还没有找到。如果没有它,您将获得标准的 clojure repl,但您的应用程序不会加载。

注意,您需要 @ 符号,以便它从相对于类路径的 jar 文件加载(即从 jar 的根目录)。

这应该启动一个 repl,您可以在其中更改 namespace 并在其中运行应用程序函数。

此外,您可以安装 rlwrap 并在其前面添加 java 命令,以便您可以正常使用历史记录和箭头键。

<强>2。在应用程序中嵌入 REPL 服务器以从另一个客户端连接

您可以在应用程序启动时嵌入您自己的 repl(例如,仅启动 repl 实例的简单 main),然后您的用户可以运行您的 jar 文件,并使用他们选择的工具(cider- jack-in, 'lein repl connect ...')

这个的简单版本是:

(start-server :port 7890 :handler cider-nrepl-handler)

替换您想要的端口,请参阅下文以了解要导入的适当命名空间。

这是一个更完整的示例:

(ns your-app.server
(:gen-class)
(:require [cider.nrepl :refer (cider-nrepl-handler)]
[clojure.tools.nrepl.server :refer [start-server]]))

(def repl-server (atom nil))

(defn create-nrepl-server!
[repl-port]
(println (format "starting nrepl server on port %d" repl-port))
(reset! repl-server (start-server :port repl-port :handler cider-nrepl-handler)))

(defn -main []
;; ...
(let [repl-port 7890]
(create-nrepl-server! repl-port)
(spit ".nrepl-port" repl-port)))

您的project.clj 文件中需要以下内容

:plugins        [[cider/cider-nrepl "0.10.0"]] ;; or whatever version you prefer
:dependencies [[org.clojure/tools.nrepl "0.2.12"]]

连接到您的自定义 repl 后,将应用标准规则,只需更改命名空间并调用您的函数。

关于clojure - 从我的应用程序中启动 REPL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34574836/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com