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 的情况下,默认值也没有通过验证器验证。相反,我必须编写一个单独的手动验证函数。我怀疑这是因为验证器只在选项被调用时才会运行。

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

1 答案

0

由于您控制默认值,因此可以假设您应该自己检查它——因为如果默认值无效,那就是编程错误,而不是使用错误。

它还像一个逃生门,让您可以提供用户无法通过选项提供但有时需要的自定义默认值。

当然,我认为这是一个合理的默认值,但为什么不给开发人员提供一个选项,让他们可以选择验证默认值呢?将选项自动回退到某些外部值(环境变量、配置文件等)是一种极其常见的模式,tools.cli可能更好地支持这种模式,这将是一种简单的方式来实现。
我将将其标记为https://clojure.atlassian.net/browse/TCLI-99,但在做出任何决定之前,需要进行分析。根据之前没有其他人提出过这样的要求,我认为这不像你说的那样普遍。
我认为以前没有提出这个请求是有道理的,因为以前Clojure由于JVM启动时间的问题,并不是构建基于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已被使用)的属性来强制用户设置此选项。
by
在tools.cli中,“required”一词表示选项后需要值,而不是选项本身是必需的。

我看到了几项关于增强的请求,这些都属于后处理类别,如处理非选项参数和处理强制选项检查等。目前,tools.cli没有任何“钩子”来做这件事,但看起来这是一个很好的增强领域,所以我将仔细考虑。

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