请分享您的想法在 2024 年 Clojure 状态调查!

欢迎!请查看 关于 页面以获取更多关于其工作方式的详细信息。

0
tools.build
retagged

类似于 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。或者,使用一个线程在进程运行时消耗输出或重定向到一个临时文件。

如果需要,我将提供一个补丁,并当达成一致的解决方案方向后。

1 答案

0

此条目已记录为 https://clojure.atlassian.net/browse/TBUILD-1,尚未有时间考虑。

...