0

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

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

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

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

4

1 回答 1

1

我应该能够从我的开发盒连接到它并触发通过线路检索依赖项(然后将其缓存在机器上),然后连接所有源代码和 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 部署到远程机器上,而且通常是在容器中。到那时,我已经在本地对系统进行了锻炼/测试,并且有信心它会按预期运行。如果你的大部分系统在没有部署的情况下是不可测试的,这可能表明你应该把它分解成更小、更可测试的部分。

于 2018-03-15T12:37:58.130 回答