笔记: Exploring CLI Best Practices

最近读到一篇关于 CLI 的文章: Exploring CLI Best Practices, 关于开发 CLI 程序的一些最佳实践, 感觉非常受益. 文中提出14条建议, 挨个实践下来即可.

1. Every option that can have a default option should have a default option.

所有可以有默认值的选项都应该设置默认值.
但我觉得还值得补充的是: 默认值必须通过日志/print 方式告知用户. 不然有些选项默认值对新用户有种懵逼的效用.

2. Provide long, readable option names with short aliases.

提供可读性很好的长名字的选项名称和短的简写选项名称
例如, 在 python 中:

parser.add_argument('-v', '--version', help="print the current version")

文中的理由是: 长名字可读性好, 而简写方便用户在写脚本的时候方便. 我不是很同意提供简写选项.理由如下:

  • 简写重名情况下, 有人倾向于选择一个根本与长名称选项不相关的简写, 很迷惑, 例如, -v 可以用于 --version 标识打印版本号, 但如果我还有一个选项 --verbose 用户打开调试日志怎么办? 换一个其他的简写?
  • 不提供简写是避免有人用简写开发了脚本而其他人接手后还要继续查询 help 搞清楚什么含义.

3. Use common command line options.

用常用的选项名称
就是遵从大多数的常用单词, 别自己发明. 给出的链接也很有用, 值得参照.

4. Provide options for explicitly identifying the files to process.

提供选项支持指定要处理的文件

5. Don’t have positional options.

不要使用位置相关的选项
例如: your_command arg1 arg2 arg3 必须按照位置来的情况. 使用 --option option_value 的方式.
不过这个也特殊的情况, 比如一个命令包含了几个大模块的功能, 第一个选项用于指定子模块. 例如: airflow 就是第一个选项是模块名称, 每个模块下面都是通过 --option option-value 的方式指定参数.

6. Provide an extensive, comprehensive help command that can be accessed by help, --help or -h.

通过 -h 或者 --help 选项打印帮助文档.

7. Provide a version command that can be accessed by version, --version or -v.

通过 -v 或者 --version 打印版本号
但我觉得还不够, 应该在每次程序运行日志开始自动打印当前命令的版本号. 方便时候调试定位问题.

8. Don't go for a long period without output to the user.

长时间运行的程序, 通过打印一些信息告知用户程序没完蛋, 而是很忙

9. If a command has a side effect provide a dry-run/whatif/no_post option.

如果命令有副作用, 提供 dry-run 选项
dry-run 选项就是仅仅检测当前情况是否满足运行条件, 而不最终执行. dry-run 是我认为最性感的 CLI 的feature. 不光针对有副作用的命令, 针对需要非常长时间运行的命令也是如此(例如 Apache Pig 就有dry-run 特性, 而 Hive 就没有), 开发过程必定要调试命令是否ok.
实现 dry-run 不是简单的提供一个什么都不干的选项糊弄用户, 而是分几步走:

  1. 确定命令的核心功能, 比如 Pig 就是运行 pig 计算脚本
  2. 在执行核心功能前一步, 检测 dry-run, 如果打开, 程序就此停止, 告知用户.
  3. 在 dry-run 作用前, 检测所有的参数合法性, 执行环境是否OK.

再说一遍: dry-run 是方便用户大胆调试危险操作, 而不是糊弄用户. 要保证 dry-run 打开执行成功的情况下, 删掉dry-run 程序立马执行核心功能

10. For long running operations, allow the user to recover at a failure point if possible.

长时间运行的程序, 允许用户可以从上次失败的点恢复操作

这个说起来简单, 但做到不容易. 毕竟涉及到 checkpoint 的存储和恢复. 举一个容易实现的例子: maven 编译多模块的 Java 项目, 提供了 mvn 命令 -rf 模块名称 的方式, 从之前失败的模块继续执行.

11. Exit with nonzero status codes if and only if the program terminated with errors.

正常执行成功 exit_code 保证为0. 不正常情况保证 exit_code 非零
这是必须遵守的规范, 不遵守可以视为 bug. 是保证在shell 中通过 $? ==0 判断上一个命令是否成功的基础.

12. Write to stdout for useful information, stderr for warnings and errors.

正常信息输出到 stdout, 错误和警告信息输出到 stderr

13. Keep the CLI script itself as small as possible.

CLI 脚本本身越简单越好, 核心逻辑放到其他地方

14. Reserve outputting stack traces for truly exceptional cases.

保留错误情况下的堆栈信息
用 Java 的话说: 吃异常等于吃屎, 最好别干.

总结

非常好的一篇关于 CLI 开发的最佳实践, 虽然有几点我不是很赞同, 但还是值得仔细阅读, 认真遵守大多数.
-- EOF --

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容