我有一个程序,它接受在命令行界面中的多个选项,并且允许我将这些选项也指定在配置文件中。这样,在所有调用中传递 --quiet
的情况下,你可以将映射 {quiet true}
放入 .splint.edn
以自动启用它。有时通过在命令行中传递选项来覆盖配置文件也是很有价值的,因此在构建选项映射的过程中,我首先加载配置文件,然后合并命令行选项:(merge local-config cli-options)
然而,如果在 tools.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}
。这让我可以选择合适的价值。
非常感谢!