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

欢迎!请查看关于页面获取更多关于该网站如何运作的信息。

0
贡献库

在我的工作中,经常出现以下模式。

(def cli
  [["-f" "--foo FOO"
    :default-fn (fn [_] (System/getenv "FOO"))
    :default-desc "$FOO"
    :validate [seq "You must either use --foo or set $FOO"]])

不幸的是,这种方法并不能按预期工作。即使有 :post-validation true,默认值也不会被验证器验证。相反,我必须编写一个单独的 manual validation 函数。我怀疑这是因为验证器只有在选项被调用时才会运行。

:post-validation 在具有默认值的选项上运行验证器是否有意义?或者可能需要一个额外的选项,比如:validate-default

1 答案

0

由于你控制默认值,因此默认地假设你应该自己检查它——因为如果默认值无效,则是一个编程错误,而不是使用错误。

它还充当一个逃生孔,你可以提供用户无法通过选项提供的自定义默认值,这在某些情况下是有用的。

当然,我认为这是一个合理的默认值,但为什么不给开发者提供验证默认值(如果他们想的话)的选择呢?将选项跌落到某种外部值(环境变量、配置文件等)的这种模式极为常见,tools.cli可能支持得更好,这是一条简单的解决方案。
我将将其跟踪为https://clojure.atlassian.net/browse/TCLI-99,但在做出任何决定之前需要进行分析。我会根据没有人之前要求过这一点来说明,这不是您所声称的那样常见。
我认为以前没有要求这项服务是有道理的,因为以前由于JVM启动时间,Clojure并不是用于构建基于CLI程序的实际工具。现在有了babashka,我猜测,随着使用Clojure构建CLI的人越来越多,将会有更多的请求来改进Clojure的CLI构建工具。如果你看看其他更常用的构建CLI的生态系统(如Python、Ruby等),它们有更复杂的CLI构建工具。例如,Python的argparse(在标准库中)除了处理选项外还处理位置参数,并为你处理--help文本。Python的click在此基础上添加了在AWS CLI或leiningen风格的“嵌套CLI”中轻松构建工具。相比之下,Clojure的工具相当简单,这在之前的生态系统状态下是有道理的,但可能未来不会有这样的效果。
我也对这种行为感到困惑,因为我试图使用tools.cli来强制必须的选项。正如在#clojure slack频道中建议的那样

(def cli-options
  [["-U" "--gitlab-uri URI" "Gitlab host URI" :parse-fn #(URI. %)]
   ["-t" "--gitlab-token TOKEN" "Gitlab token"
    :default ::absent
    :validate [(fn [x] (println "XXXXX:" x) (not= ::absent)) "Missing required option: --gitlab-token"]
    ]
   ["-h" "--help"]])

不起作用,因为:validate函数从未被调用。我实际上更喜欢某种类型的:mandatory(:required已被占用)属性来强制用户设置此选项。
在 tools.cli 中,“required”表示选项后需要值,并不意味着选项本身是必需的。

我看到了许多增强功能的请求,这些功能都属于后处理类别,例如处理非选项参数和处理强制选项检查等。这是 tools.cli 目前没有任何“钩子”的功能,但它似乎是一个很好的增强领域,因此我会认真考虑一下。

感谢对此事的反馈。
...