请在 2024 年 Clojure 状况调查! 中分享您的想法。

欢迎!请参阅关于页面了解有关如何使用本平台的更多信息。

+1
工具
编辑

大家好,我已阅读了 GitHub 仓库中 README 的 shadow-cljs 快速入门指南,并在浏览器控制台得到了期望的信息。接下来,我想向项目中引入 deps.edn。在添加了 deps.edn 之后,我遇到了一些(自找的)困难。

系统详情
操作系统:WSL2
Java 版本:OpenJDK 11.0.15
Clojure CLI 版本:1.11.1.1113

项目中只包含 shadow-cljs.edn 时,该文件的正文内容是

;; shadow-cljs.edn
{:source-paths ["src/dev"
                "src/main"
                "src/test"]
 :dependencies []
 
 :dev-http {8080 "public"}
 :builds {:frontend {:target :browser
                     :modules {:main {:init-fn acme.frontend.app/init}}}}}

在此阶段,使用 Calva 的“shadow-cljs”项目类型进行挂载,既可以启动,又可以连接到“:frontend”构建,运作得非常顺利。

如第一段所述,我在将 deps.edn 引入项目中时遇到了困难。

将以下内容添加到主项目目录中的 deps.edn

;; deps.edn
{:paths ["src/main"
"src/dev"
"src/test"]

 :aliases
 {:cljs {:extra-deps {thheller/shadow-cljs {:mvn/version "2.19.0"}}}}}

shadow-cljs.edn 更改为

 ;; shadow-cljs.edn
    
 {:deps {:aliases [:cljs]}
        
:dev-http {8080 "public"}
        
:builds {:frontend {:target :browser
:modules {:main {:init-fn acme.frontend.app/init}}}}}

在此阶段,使用 Calva 的“deps.edn + shadow-cljs”项目类型进行挂载会导致包含“Failed starting cljs repl for build: :frontend. Is the build running and connected?”(无法启动构建::frontend 的 cljs repl。构建正在运行并连接吗?)的错误。

Calva 连接日志还提供了以下信息:“shadow-cljs 尚未启动!”和“如果您有一个正在运行的 shadow-cljs 服务器或监视器,则您尚未连接到该进程。”

看起来构建并未启动。如果我们运行 npx shadow-cljs watch frontend 然后尝试连接到 REPL,将得到和之前一样的错误信息。

结果我发现我应该继续使用“shadow-cljs”项目类型(在这种情况下,添加 deps.edn 会一帆风顺)。

这让我想知道

  • 何时使用哪种项目类型?
  • 全栈项目推荐哪一个?

感谢 Peter 和 Calva 的贡献者!

1 回答

+2

嗨那里!感谢你询问这个问题。Calva 中的这些项目类型命名有点令人困惑,即使我不知道如何 else 来命名它们。使用哪种项目类型取决于项目的配置方式。

shadow-cljs 项目可以配置为用 shadow-cljs 或 deps.edn 启动。最常用的方案是其中之一。这不仅仅与 Calva 有关,更多的是关于项目应该如何启动。Calva 中的项目类型是配置 + 一些启动项目的代码。

shadow-cljs 项目类型使用类似于以下命令行启动开发 REPL:

npx shadow-cljs watch -d cider/cider-nrepl:0.27.4  <build-id-1> [<build-id-2> ...]

你就是这样配置你的项目以启动的,所以这是为什么它能工作。

deps.edn + shadow-cljs 项目类型使用类似于以下命令行启动 REPL:

clojure -Sdeps '{:deps {nrepl/nrepl {:mvn/version,"0.9.0"},cider/cider-nrepl {:mvn/version,"0.27.4"}}}' -M<alias-1>[<alias-2>...] -m nrepl.cmdline --middleware "[cider.nrepl/cider-middleware]"

我现在记不起在 deps.edn 中需要什么以使其工作,但无论如何,那里需要有支持该功能的内容。(一些 :main 配置来启动 shadow-cljs 监视器。)你的项目没有为此而配置,这就是为什么该方案无法工作。(Calva 的错误处理不够好,因此你无法获得关于错误的正确信息。)

在这两种情况下,一旦 Clojure REPL 启动,Calva 将

  1. 连接到该 REPL。
  2. 克隆 nREPL(用于 REPL 连接的协议)会话。这是 Calva 的 clj 会话,将在 .clj 文件中使用,以及当 Calva 配置为执行此操作时,在 .cljc 文件中使用。(这是一个可切换的功能,您可以通过状态栏访问它。)
  3. 再克隆一次 nREPL 会话。这将是一个用于 .cljs 文件和根据那个切换选项使用 .cljc 文件的 Calva cljs 会话。
  4. “提升” cljs 会话到 ClojureScript REPL。Calva 使用 shadow-cljs 开发 API 来实现此功能。只需使用终端执行此操作时会在 REPL 提示符中使用的相同命令。
  5. 选择要监视的构建之一。再次使用 shadow-cljs 开发 API。

注意,除了 Calva 之外,您可以在手动执行这些步骤,我建议您这样做,这样就可以搞清楚 Calva 在“Jack-in”并连接时做什么。但连接 Calva 时,最好让 Calva 来做,因为这样 Calva 就可以更新它的一些状态,以便界面反映哪个 REPL 正在被使用等。

我希望这解答了 在 Calva 中何时选择哪种项目类型 的疑问。

您实际上是在问 何时使用一个或另一个项目设置。我将让其他人回答这个问题,因为这不属于我的专业领域。但是,我可以说我更喜欢尝试使用 shadow-cljs 来启动开发 REPL。我认为这通常有效。

...