我有一个程序,它接受在 CLI 中指定的一组选项,我也允许这些选项在配置文件中指定。这样,你不需要在所有调用中都传递 --quiet
,你只需在 .splint.edn
中放入地图 {quiet true}
以自动启用它。有时通过在 CLI 中传递选项来覆盖配置文件是有价值的,因此在构建选项映射时,我首先加载配置文件,然后合并 CLI 选项:(merge local-config cli-options)
然而,如果我工具-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}
。这让我可以按适当的方式选择正确的值。
非常感谢!