我一直在使用 Clojure、ClojureScript、lein、shadow-cljs、re-frame、reagent、Emacs 和 CIDER 来开发 Clojure/ClojureScript 动态 Web 应用程序项目。
通常,我通过执行
shadow-cljs watch app
来构建项目。效果很好。我可以使用该应用程序并观察更改。
目前,我正在通过 GitHub Actions 开展持续集成项目。在这个新环境中,我想使用不同的命令:
shadow-cljs compile app
。
但是,我遇到了问题。在 GitHub Actions env 和我的本地环境中(复制 GitHub Actions 上的步骤)。
命令返回的结果很奇怪。首先,它说编译顺利,
Build completed
,并且终端显示一些无害的警告:
shadow-cljs compile app
shadow-cljs - config: /Users/pedro/projects/my_project/shadow-cljs.edn
WARNING: random-uuid already refers to: #'clojure.core/random-uuid in namespace: portal.runtime.browser, being replaced by: #'portal.runtime.browser/random-uuid
[:app] Compiling ...
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
WARNING: abs already refers to: #'clojure.core/abs in namespace: day8.re-frame-10x.inlined-deps.garden.v1v3v10.garden.color, being replaced by: #'day8.re-frame-10x.inlined-deps.garden.v1v3v10.garden.color/abs
WARNING: abs already refers to: #'clojure.core/abs in namespace: garden.color, being replaced by: #'garden.color/abs
[:app] Build completed. (1121 files, 27 compiled, 8 warnings, 45.85s)
------ WARNING #1 - :redef -----------------------------------------------------
(... omitted ...)
不幸的是,终端永远保持这样的状态。它的行为类似于
watch
命令...但是,compile
不应该是这样的。
终端未完成该过程。没有出口。即使构建已完成,如警告之前的最后一行所述。
感觉像是陷入了僵局。终端仍然有响应,因为我可以使用
Control-c
取消该过程。但是,除了取消之外,它还被冻结了。这对于 GitHub 操作来说可能是灾难性的,因为您要为正在进行的流程付费。
在
shadow-clj.edn
上,我尝试注释掉compilation-options
:
;:compiler-options {:optimizations :none}
但这并没有什么区别。同样的问题也发生在
shadow-cljs release app
。
发现 GitHub 问题与类似问题后,我也尝试过:
:js-options {:resolve {"highlight.js" {:target :npm :require "highlight.js/lib/core"}}}
我的假设之一是
highlight.js
在解析字符串和/或文件时造成一些麻烦...
我也担心问题可能是某些 REPL 被某些依赖项触发并阻塞退出进程......但我不知道在哪里寻找它。
为什么会发生这种情况?可能是什么原因造成的?我该如何解决?
;;;;
更新:
在@thomasheller友善的回答之后,我尝试了一些东西。我相信就目前情况而言,除了宏之外,所有提示都可以被丢弃:
1 - 该项目不使用
user.clj
2 - 构建挂钩是默认设置,基本上是一条注释:
:build-hooks [;; this will create a build report for every release build
;; which includes a detailed breakdown of the included sources
;; and how much they each contributed to the overall size:
#_(shadow.cljs.build-report/hook
{:output-to "build-reports/report.html"})]
3- 在尝试编译之前没有
shadow-cljs start
、server
或 watch
进程。无限compile app
的问题发生在重新启动我的MacBook后,在CI上,在其他人的PC上......所以,它是无关的。
好的。现在,让我们谈谈宏...该项目的主存储库有 6 个
defmacros
- 根据 git grep
(我还没有检查依赖项)。
我对读取文件所涉及的宏之一表示怀疑:
(defmacro slurp [file & [default]]
(if (.exists (io/file file))
(clojure.core/slurp file)
default))
为什么会存在这种情况?好吧,它在另一个读取与环境变量相关的配置文件的宏中使用:
(defmacro read-open-config [env-var]
(clojure.edn/read-string (slurp (str "config/" (System/getenv env-var) "-open.edn"))))
我们有多个用于不同目的的配置文件(我知道这不是标准做法......)。
感觉太有活力了...
首先澄清几点。
compile
生成开发版本,未应用任何优化。设置任何与此相关的内容都不起作用。release
。这避免了包含所有与开发相关的代码(例如。highlight.js
,re-frame-10x
)。compile
或release
通常不会进入。highlight.js
错误会提前失败并出现可见错误,您不会到达“构建已完成”。发生这种情况的原因有多种,在没有看到构建配置/设置的情况下很难调试。一些猜测:
user.clj
,当进程启动并加载此命名空间时,它会启动额外的“东西”? Clojure 将无条件加载此内容,而 Shadow-cljs 无法阻止任何可能发生的事情。:build-hooks
来启动其他内容。它可以启动一个不退出的附加 css watch 进程?shadow-cljs start
、server
或 watch
流程?再加上上面那可能就等server
停止了。在您的本地计算机上,watch
可能仍在运行?您可以通过 npx shadow-cljs release build --force-spawn
阻止尝试连接服务器,但这仅在服务器实际运行时才有用。通常shadow-cljs会在
compile
或release
后关闭。我不知道有人在成功构建后遇到过任何问题。您链接的问题与您的问题无关,因为它从未完成构建。
经过长时间的研究过程,发现问题来自于私有依赖内部的测试。显然,一些使用异步进程配置文件的测试阻碍了编译过程的完成。
注释掉一些旧测试后,编译按预期进行。