请注意,这不仅对clojure.java.shell和by implication,clojure.java.browse很重要,而且这还将启用ClojureScript浏览器REPL在where xdg-open used的平台上正确启动。目前ClojureScript快速入门指南在很多系统上几乎是损坏的。大多数第一次使用ClojureScript的用户不会喜欢调试这样的东西(或者我只是比大多数人更加固执:))).
在some平台上clojure.java.browse/browse-url调用clojure.java.shell/sh来执行cmdline,使用xdg-open打开网页浏览器。作为Nix工具,xdg-open将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}中创建了本地副本,添加了到clojure.java.shell的函数(launch),忽略I/O流但返回退出代码,并将browse-url修改为使用launch。好多了!浏览器和REPL,就像快速入门指南中所承诺的那样。
个人笔记:虽然我刚刚开始实验ClojureScript,但我已经使用Clojure几年了。
已审查: Alex Miller