我有一个程序,它可以在 CLI 接受一些选项,我也允许将它们在配置文件中指定。这样,我们就可以将 --quiet
命令传递给所有调用,而不是要传递到 .splint.edn
,我们就可以在 {quiet true}
中将映射放入其中以自动启用它。有时通过传递 CLI 中的选项来覆盖配置文件很有价值。因此,在构建选项映射时,我首先加载配置文件,然后合并 CLI 选项:(merge local-config cli-options)
但是,如果我在 tools.cli 规范中指定了一个默认值,那么我将失去这种行为,因为默认选项将会无条件地覆盖配置文件,因为它总是存在于 CLI 选项映射中。
我选择在工具的 CLI 规范中省略 :default
键,而是在选项描述字符串中写下 "默认为 true。"
。例如,[nil "--[no-]parallel" "并行运行 splint。默认为 true。"]
,然后稍后 (get config :parallel true)
,然后稍后 (merge local-config cli-options)
。这意味着我的摘要中没有打印出美观的 FALSE
。(例如,--[no]-parallel FALSE 并行运行 splint。
)
关于如何解决这个小问题,我还有一些想法(除了“你已经解决了,不用做什么!”之外的方案)。
1) 从 cli/parse-opts
返回一个额外的键,类似于 :defaults
。这将是一个顺序或集合,用于使用默认值的选项。这样,我可以在 (merge (select-keys cli-options defaults) local-config (apply dissoc cli-options defaults))
中添加一些逻辑。
2) 在 cli/parse-opts
规范中添加 :default-display
,它将打印默认值而不将其添加到选项映射中。这将由用户(开发人员)负责确保它实际上被添加到选项映射或以某种方式使用。
3) 添加一些功能,允许在摘要中指定默认值,但在映射中使用其他值。例如,--[no]-parallel FALSE
,但映射中为 {:parallel :false}
。这将使我能够根据需要选择正确的值。
非常感谢!