我有一个程序,该程序在命令行接口(CLI)中接受许多选项,并允许我在配置文件中指定这些选项。这样,您就不需要总是传递--quiet
到所有调用中,而可以把映射{quiet true}
放入.splint.edn
中以自动启用它。有时,通过在命令行中传递选项来覆盖配置文件是非常有价值的。因此,在构建选项映射时,我首先加载配置文件,然后合并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}
。这将使我可以根据需要选择正确的值。
非常感谢!