我应该能够从我的开发盒连接到它并触发通过线路检索依赖项(然后将其缓存在机器上),然后连接所有源代码和 eval 直到遇到障碍,对吗?
是否有可能做到这一点,涉及的障碍是什么?
是的,但您需要指定-b
(地址服务器侦听)而不是-H
(连接客户端的主机):
$ boot wait repl -s -b 0.0.0.0 -p 3000
nREPL server started on port 3000 on host 0.0.0.0 - nrepl://0.0.0.0:3000
然后根据需要连接到它,例如lein repl
:
$ lein repl :connect 127.0.0.1:3000
现在您可以在 REPL 中添加一个依赖项,它将被下载到服务器/主机上。在客户端 REPL 中:
boot.user=> (set-env! :dependencies #(into % '[[clj-time "0.14.0"]]))
如果您正在查看服务器控制台,您会看到它正在下载依赖项:
Retrieving clj-time-0.14.0.pom from https://repo.clojars.org/ (3k)
Retrieving joda-time-2.9.7.pom from https://repo1.maven.org/maven2/ (32k)
Retrieving clj-time-0.14.0.jar from https://repo.clojars.org/ (22k)
Retrieving joda-time-2.9.7.jar from https://repo1.maven.org/maven2/ (618k)
然后回到客户端:
boot.user=> (require '[clj-time.core :refer [now]])
nil
boot.user=> (now)
#object[org.joda.time.DateTime 0x1f68b743 "2018-03-15T12:16:29.342Z"]
有人做过吗?
是的,我见过人们从远程服务器托管 nREPL 并连接到它们以修补正在运行的系统。
为什么这是个坏主意?
一般而言,我们希望可重现的构建和稳定的工件能够在一定程度上确定正在发布的代码。在服务器上即时进行这种类型的开发与这些目标背道而驰,这使得确定哪些代码在哪里运行变得更加困难。我会尝试构建系统(及其测试),以便正常开发不需要这种程度的远程动态。
听起来您的主要问题是您的开发/测试/运行反馈循环中的繁琐链接(CI/CD)。如果可以避免的话,我会在进入动态依赖热加载 nREPL 之前探索其他优化反馈循环的选项。当然,如果你需要它就在那里!
你能展示你在远程机器上引导 Clojure 应用程序的方法吗
就个人而言,我只将 JAR 部署到远程机器上,而且通常是在容器中。到那时,我已经在本地对系统进行了锻炼/测试,并且有信心它会按预期运行。如果你的大部分系统在没有部署的情况下是不可测试的,这可能表明你应该把它分解成更小、更可测试的部分。