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

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

+1
工具
编辑

大家好,我已经在GitHub仓库的README中的shadow-cljs快速入门指南中处理了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}}}}}

在此阶段,使用“shadow-cljs”项目类型在Calva中启动并连接到“: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}}}}}

在此阶段,使用“deps.edn + shadow-cljs”项目类型在Calva中连接会引发错误,错误信息包含“Failed starting cljs repl for build: :frontend. Is the build running and connected?”

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

看起来构建尚未启动。如果我们运行npx shadow-cljs watch frontend然后尝试连接到REPL,之前的错误消息仍然会出现。

结果是,我应该继续使用“shadow-cljs”项目类型(在这种情况下,添加deps.edn没有任何麻烦)。

这让我想知道

  • 何时使用哪种项目类型?
  • 全栈项目更适合哪一种?

感谢Peter和其他Calva的贡献者!

1 个回答

+2

大家好!感谢提问。在Calva中,这些项目类型的命名有点令人困惑,即使我实际上也不知道还可以如何命名它们。选择使用哪种项目类型取决于项目的配置。

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会话。这将作为Calva的cljs会话使用,并用于.cljs文件,以及根据那个开关决定是否会使用.cljc文件。
  4. “提升”cljs会话到ClojureScript REPL。Calva使用shadow-cljs开发API来完成这一点。与您在终端中从REPL提示符执行此操作时使用的命令相同。
  5. 选择要监视的构建之一。再次使用shadow-cljs开发API

请注意,在Calva之外,您可以手动执行这些步骤。我可以建议您偶尔这样做,以解开Calva在Jack-in和连接时的操作。但是,当通过Calva连接时,最好让Calva来做,因为这样Calva就能够更新其状态的一部分,从而使UI反映正在使用的REPL等。

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

您实际上询问的是何时使用一个或另一个项目配置。我会让其他人来回答这个问题,因为这超出了我的专业领域。但可以说的是,我更喜欢尝试使用shadow-cljs启动开发REPL。我认为这通常能起作用。

...