为什么“shadow-cljs编译应用程序”返回“构建完成”,但进程继续运行而不退出?

问题描述 投票:0回答:2

我一直在使用 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"))))

我们有多个用于不同目的的配置文件(我知道这不是标准做法......)。

感觉太有活力了...

compilation deadlock clojurescript shadow-cljs
2个回答
3
投票

首先澄清几点。

  • compile
    生成开发版本,未应用任何优化。设置任何与此相关的内容都不起作用。
  • CI 系统可能应该使用
    release
    。这避免了包含所有与开发相关的代码(例如。
    highlight.js
    re-frame-10x
    )。
  • 依赖项无法“启动 REPL”。 Shadow-cljs“服务器模式”提供了它,
    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
后关闭。我不知道有人在成功构建后遇到过任何问题。您链接的问题与您的问题无关,因为它从未完成构建。


0
投票

经过长时间的研究过程,发现问题来自于私有依赖内部的测试。显然,一些使用异步进程配置文件的测试阻碍了编译过程的完成。

注释掉一些旧测试后,编译按预期进行。

© www.soinside.com 2019 - 2024. All rights reserved.