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

欢迎!请参阅关于页面以了解更多关于此功能的信息。

+11
IO
关闭

最新的Clojure alpha版本添加了clojure.java.process命名空间。我需要在我正在工作的Clojure程序中进行更好的进程创建处理,因此我调查了是否需要将我的Clojure依赖更新到1.12.0-alpha2,并想就我在评估此命名空间时遇到的功能和错误向您提供反馈。

  1. 错误流 -> stdout 重定向不工作
    当提供:err :stdout选项时,启动的进程不会将输出重定向到stdout,因为(.redirectErrorStream pb)在第89行是一个getter。它应该是(.redirectErrorStream pb true)。您可以使用(exec {:out :inherit :err :stdout} "bash" "-c" "ls >&2")进行测试。

  2. 无法删除环境变量
    删除环境变量是在启动进程时的一个有用功能,它甚至在ProcessBuilder的Javadoc示例中进行了说明。我建议添加支持通过将nil环境值视为请求从启动进程的环境中删除环境变量来删除环境变量。

  3. 无法覆盖exec的:err :inherit选项
    Exec文档指出可以覆盖exec的默认选项,但在第137行,默认选项优先于用户提供的选项,应该是(merge {:err :inherit} opts)

  4. 捕获kv-opt是:buffer-size,而不是:buffer
    在第119行,capture文档字符串表示其kv-opt与jio/copy中相同——:buffer:encoding,但jio/copy的kv-opt是:buffer-size:encoding

  5. 挑剔:检查in/out/err/dir的真实性是不必要的
    第 85-90 行代码执行了选项存在性的检查,但这是不必要的,因为第 75 行已提供了默认值。

已关闭,备注:大部分在 1.12.0-alpha4 中解决,其余即将推出。
只是一个注释

babashka.process 有 :env 和 :extra-env。:env 替换环境(允许您从当前 System/getenv 中复制并删除内容)而 :extra-env 仅添加环境变量。与 ProcessBuilder 类似,:env 默认为 System/getenv。

例如,删除环境变量:

```
(require '[babashka.process :as p])

(let [env (-> (into {} (System/getenv))
              (dissoc "PATH"))]
  (p/shell {:env env} "bash" "-c" "echo $PATH"))
```

这比 nil 选项稍微详细一些,但我也很喜欢。

1 个答案

+1
...