2024 Clojure现状调查中分享您的想法!

欢迎!请查看关于页面,了解更多有关该功能的信息。

+11票价
IO
关闭

最新Clojure alpha版本添加了clojure.java.process命名空间。我在开发中的一个Clojure程序需要更好的进程创建处理,所以我研究了是否需要将我的Clojure依赖项更新到1.12.0-alpha2,并想就我在评估此命名空间时遇到的功能和错误给你反馈。

  1. 错误流 -> 标准输出重定向不工作
    在提供:err :stdout选项时,启动的过程不会将输出重定向到标准输出,因为在89行(.redirectErrorStream pb)是一个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-opts与jio/copy的相同——:buffer:encoding,但jio/copy的kv-opts是:buffer-size:encoding

  5. 挑剔:检查in/out/err/dir的真实性是不必要的
    第85-90行执行了检查opts是否存在,这是不必要的,因为第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

选择
...