我有一个程序,它接受多个通过命令行界面传递的选项,并且我还允许这些选项在配置文件中指定。这样,我们不必在所有调用中都传递--quiet
,我们还可以在.splint.edn
中将映射{quiet true}
放入其中,以便自动启用。有时 coverting~ (覆盖配置文件) 传递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}
。这将让我可以选择适当的值。
非常感谢!