我有一个程序,它接受在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}
。这将允许我根据需要选择正确的值。
不胜感激!