请注意,这对于 clojure.java.shell 和 clojure.java.browse 都很重要,并且这将启用 ClojureScript 浏览器 REPL 在使用 xdg-open 的平台正确地启动浏览器。目前 ClojureScript 快速入门说明在许多系统上基本上是无效的。大多数 ClojureScript 的首次用户不会享受像这样(或者也许我比大多数人更固执 :))的调试。
在某些平台上,clojure.java.browse/browse-url 使用 xdg-open 通过 clojure.java.shell/sh 来执行 cmd 线。作为一个正常的 **Nix 工具,xdg-open 会将它的文件描述符传递给新的进程。(我不知道是否在某处有关于 xdg-open 的文档,但可以轻松证明。)
clojure.java.shell/sh 总是读取执行进程的 STDOUT 和 STDERR 流。当目的是收集子进程的输出时,当然这是好事。然而,当使用 xdg-open 启动浏览器时,这些流直到浏览器退出才关闭。对于 clojure.java.browse/browse-url 的调用者,似乎函数“永远不会”返回。
我们需要的是 clojure.java.shell/sh 的一个版本(或 sh 的一个选项),它忽略输出流并只返回退出代码。我们严格使用子进程是为了其副作用。与使用 doseq 而不是 map 稍有相似,但我们需要子进程的退出代码。
为了使 ClojureScript 浏览器 REPL 正常工作,我在 clojure.java.{browse,shell} 中创建了一个本地副本,添加了一个(launch)函数到 clojure.java.shell,它忽略输入/输出流但返回退出代码,并将 browse-url 修改为使用 launch。好多了!浏览器和 REPL,正如 Quick Start 说明中所承诺的那样。
个人笔记:虽然我刚开始尝试 ClojureScript,但我已经使用 Clojure 好几年了
已审阅: Alex Miller