欢迎!请查看 关于 页面以获取更多关于其工作方式的详细信息。
类似于 https://ask.clojure.org/index.php/11509/clojure-launch-doesnt-consume-inputstream-process-terminating
tools.build.api/process 在忽略输出并且进程有大量输出时挂起。以下是curl下载并打印1MB文本的示例
$ clj -Sdeps '{:deps {io.github.clojure/tools.build {:git/tag "v0.7.5" :git/sha "34727f7"}}}' Clojure 1.11.0-alpha3 user=> (require '[clojure.tools.build.api :as tb]) user=> (tb/process {:command-args ["curl" "https://gist.githubusercontent.com/khaykov/a6105154becce4c0530da38e723c2330/raw/41ab415ac41c93a198f7da5b47d604956157c5c3/gistfile1.txt"] :out :ignore}) % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
我认为应该使用DISCARD而不是PIPE作为ignore选项
https://docs.oracle.com/en/java/javase/16/docs/api/java.base/java/lang/ProcessBuilder.Redirect.html#DISCARD
一个要注意的地方:DISCARD仅在Java 9及更高版本中可用。我们可以在顶层用try/catch来解析DISCARD是否可用,然后使用它,如果可用,如果不可用则回退到PIPE。或者,使用一个线程在进程运行时消耗输出或重定向到一个临时文件。
如果需要,我将提供一个补丁,并当达成一致的解决方案方向后。
此条目已记录为 https://clojure.atlassian.net/browse/TBUILD-1,尚未有时间考虑。