部署Clojure/Java应用程序很难,所以我昨天有了这个想法,我想更好地了解。如果我启动一台安装了Clojure和boot-clj的机器,并在机器上运行boot wait repl -s -H 0.0.0.0 (让我们暂时忽略auth ),我应该能够从我的dev box连接到它,并通过网络触发依赖项的检索(然后这些依赖项将被缓存在机器上),然后连接所有源代码和eval,直到遇到问题,对吧?
让我们假设这是一个好主意。有没有可能做到这一点,涉及的障碍是什么?现在我在等待5分钟,等待CircleCI打包一个uberjar,然后失败,因为一些Heroku令牌过期了,但我想做的就是看到我的代码在登台环境中运行,这样我就可以连接更多的代码并重新评估它。
首先想到的是nREPL身份验证,我在任何nREPL库中都没有提到它。假设这是一个更高级别的网络问题,我将通过VPC进行ACL。
有人这么做过吗?为什么这是个坏主意?您能否展示一下在不使用git或SSH的情况下在远程计算机上引导Clojure应用程序的方法(除了初始REPL启动)?
发布于 2018-03-15 20:37:58
我应该能够从我的dev box连接到它,并通过网络触发依赖项的检索(然后缓存到机器上),然后连接所有源代码和评估,直到遇到问题,对吗?
有没有可能做到这一点,涉及的障碍是什么?
可以,但您需要指定-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部署到远程机器上,而且通常是在容器中。到那时,我已经在本地对该系统进行了测试,并且有一定的信心,它将按预期运行。如果您的大多数系统在没有部署的情况下是不可测试的,这可能是您应该将其拆分成更小、更可测试的部分的标志。
https://stackoverflow.com/questions/49296587
复制相似问题