我有一个程序,它在命令行接口(CLI)中接受一些选项,并允许在配置文件中指定这些选项。这样,就无需在所有调用中传递 --quiet
,用户可以将 {quiet true}
映射放入 .splint.edn
,即可自动启用它。有时通过在 CLI 中传递选项来覆盖配置文件是有价值的,因此在构建选项映射时,我首先加载配置文件,然后合并 CLI 选项:(merge local-config cli-options)
但是,如果我在 tools.cli 规范中指定了默认值,我将失去这种行为,因为默认选项会在合并时无条件地覆盖配置文件,因为默认选项总是在 CLI 选项映射中存在。
我习惯于在 tools.cli 规范中省略 :default
键,而是在选项描述字符串中简单地写入 "默认为 true。"
。例如,[nil "--[no-]parallel" "Run splint in parallel. Defaults to 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}
。这让我能根据需要选择正确值。
非常感谢!