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

欢迎!请参阅 关于 页面以了解如何工作的更多信息。

+8
工具
编辑

有时,在向 exec 函数 (-X) 传递参数时,需要在 shell 中引用字符串或壳调用,这可能有些冗长或不灵活,因为这些参数需要额外用引号引用,因为它们被解析为 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]}]
          ...) 
    
  • 在 :exec-args: 中向 deps.edn 配置添加一些内容,这将仅改变消费者的行为

其他需要考虑的事项

  • 该约定应与 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作为此问题的解决方案感到满意,因此如果核心不打算进一步追究此事,我认为这可以关闭。
...