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

欢迎!请查看 关于 页面以了解此工作的更多信息。

+8
工具
编辑

有时候在 shell 中引用字符串或 shell 调用可以在将参数传递给 exec 函数 (-X) 时显得有点冗长或笨拙,因为这些参数因为被解析为 EDN 而需要额外的引号。

这个例子最近在 Slack 上发布

clojure -X:bench :json "$(my_json_producing_cmd --blah)"

结果几乎不可能将 JSON 作为参数传递。

为这样的参数提供一种绕过 EDN 解析的方法可以缓解这个问题。

一种可能的约定是使用一个在 EDN 中通常无效的起始字符,例如 / 符号

clojure -X:bench :json /"$(my_json_producing_cmd --blah)"

替代方法

  • 在函数上使用元数据以退出处理:这将改变解析行为在实现方面,例如

      (defn foo
        {:tools.deps/exec-skip-edn-read #{:a}} 
        [{:keys [a b c]}]
          ...) 
    
  • 在 deps.edn 配置中的 :exec-args: 中添加一些内容,这将仅更改消费者的行为

需要考虑的额外事项

  • 约定应与 bash、cmd.exe 和 Powershell 都有良好的兼容性,并且在这些 shell 的语法中不表示任何特殊含义。我曾尝试过这些 shell 中的 /,这似乎没有干扰。

经过实验,我发现 / 可能比 @ 工作得更好,因为 @ 在 powershell 中有特殊含义

bb -e "*command-line-args*" /foo @bar
("/foo")

此外,@ 常常意味着:从文件中吸入内容并将该内容内联为参数。

2 回答

0
0

我为这个问题提供了一个潜在解决方案,但它是库的形式

https://github.com/babashka/cli#usage-with-the-clojure-cli

这可能有助于了解可能的解决方案。

我对使用babashka.cli作为这个问题的解决方案感到满意,所以如果core没有兴趣进一步追击,我认为这可以关闭。
...