我有一个程序,它在 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
。它将是一个选项的序列或集合,这些选项使用了默认值。这样,我可以在某些选项中添加逻辑,如 (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}
。这将使我能够根据需要选择正确的值。
非常感谢!