我有一个程序,它可以从 CLI 接收一组选项,我将它们也允许以配置文件的形式指定。这样,就可以将 --quiet
传递给所有调用,而不是在每个调用中都传递。可以在 .splint.edn
中放入映射 {quiet true}
,这样就可以自动启用它。有时通过在 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}
。这将让我可以选择适当的值。
非常感谢!