我有一个程序,它在 CLI 中接受一些选项,同时我也允许将它们指定在配置文件中。这样,我们就可以不必在所有调用中都传递 --quiet
,而是可以将 {quiet true}
放入 .splint.edn
中,以自动启用它。有时通过传递 CLI 中的选项来覆盖配置文件是有价值的,这样在构建选项映射时,我首先加载配置文件,然后合并 CLI 选项:(merge local-config cli-options)
然而,如果在 tools.cli 规范中指定了一个默认值,我会失去这种行为,因为默认选项总是在 CLI 选项映射中,所以它会无条件地覆盖配置文件。
我已经开始从我的 tools.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
。它将是一个序列或集合,其中包含使用默认值的选项。这样,我可以添加一些逻辑,例如:(apply 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}
。这将使我能够根据需要选择正确的值。
非常感谢!