Deployment 通过REPL引导Staging Clojure应用程序,包括获取依赖项

Deployment 通过REPL引导Staging Clojure应用程序,包括获取依赖项,deployment,clojure,read-eval-print-loop,nrepl,Deployment,Clojure,Read Eval Print Loop,Nrepl,部署Clojure/Java应用程序很难,所以我昨天有了这个想法,我想更好地理解。如果我启动一台安装了Clojure和boot clj的机器,并在机器上运行boot wait repl-s-h0.0.0(现在我们忽略auth),我应该能够从我的开发盒连接到它,并触发通过连线检索依赖项(然后将缓存到机器上),然后连接所有源代码并进行评估,直到我遇到障碍,对吗 让我们假装这是个好主意。有可能做到这一点吗?所涉及的障碍是什么?现在我正在等待CircleCI打包uberjar的5分钟,然后失败了,因为某

部署Clojure/Java应用程序很难,所以我昨天有了这个想法,我想更好地理解。如果我启动一台安装了Clojure和boot clj的机器,并在机器上运行
boot wait repl-s-h0.0.0
(现在我们忽略auth),我应该能够从我的开发盒连接到它,并触发通过连线检索依赖项(然后将缓存到机器上),然后连接所有源代码并进行评估,直到我遇到障碍,对吗

让我们假装这是个好主意。有可能做到这一点吗?所涉及的障碍是什么?现在我正在等待CircleCI打包uberjar的5分钟,然后失败了,因为某个Heroku令牌过期了,但我想做的就是看到我的代码在登台环境中运行,这样我就可以连接更多的代码并重新评估它

首先想到的是nREPL auth,我看到在任何nREPL库中都没有提到它。假设这是一个更高层次的网络问题,我将通过VPC进行ACL

有人这样做过吗?为什么这是个坏主意?您是否可以展示在远程机器上引导Clojure应用程序而不使用git或SSH(除了初始REPL启动)的方法

我应该能够从我的开发盒连接到它,并通过连线触发依赖项的检索(然后将其缓存在机器上),然后连线所有源代码并进行评估,直到遇到障碍,对吗

有可能做到这一点吗?所涉及的障碍是什么

是的,但您需要指定
-b
(地址服务器侦听),而不是
-H
(连接客户端的主机):

然后按您喜欢的方式连接到它,例如使用
lein repl

$ lein repl :connect 127.0.0.1:3000
现在,您可以在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并连接到它们来修补运行中的系统

为什么这是个坏主意

一般来说,我们需要可复制的构建和稳定的工件,以便在一定程度上确定发布了哪些代码。在服务器上进行这种类型的动态开发与这些目标背道而驰,使得确定哪些代码在哪里运行变得更加困难。我会尝试构建系统(及其测试),使正常开发不需要这种程度的远程动态

听起来您的主要问题是dev/test/run反馈循环中的一个繁琐链接(CI/CD)。如果可以避免的话,在转到动态依赖热加载nREPL之前,我会探索其他优化反馈循环的选项。当然,如果你需要它,它就在那里

你能展示一下在远程机器上引导Clojure应用程序的方法吗


就我个人而言,我只将jar部署到远程机器上,通常部署在容器中。到那时,我已经在本地运行/测试了该系统,并对它将按预期运行抱有信心。如果您的大多数系统在未部署的情况下无法运行,这可能表明您应该将其拆分为更小、更可测试的部分。

谢谢!我希望Jaunt或Oxlang中的不可变名称空间可以使这样的生产补丁不那么异端,因为如果code=data,immutable data=good,那么immutable namespaces=great,但唉。关于集装箱战略有什么建议吗?Immutant,JBoss,Docker?由于Java应用程序已经虚拟化,它似乎更多地是关于包含可变文件系统,或者协调蓝色/绿色部署。@PetrusTheron Docker images,并且仅仅是因为我们希望在一台主机上协调多个应用程序(一些非JVM)。这些应用程序是无状态的w/r/t文件系统。
boot.user=> (require '[clj-time.core :refer [now]])
nil
boot.user=> (now)
#object[org.joda.time.DateTime 0x1f68b743 "2018-03-15T12:16:29.342Z"]