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

欢迎!有关本平台的更多信息,请参阅关于页面。

+8
工具
编辑

在通过执行函数(-X)传递参数到shell时,有时给字符串或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作为该问题的解决方案感到满意,因此如果核心团队没有兴趣继续研究这个问题,我认为可以将其关闭。
...