重庆中公优就业IT培训机构 |
给您推荐优就业IT培训学校。优就业是中公教育旗下IT培训品牌,致力于培养面向互联网领域的高端人才,以学员就业为目的,优质就业为宗旨,是一家集UI 设计培训、Web前端培训、Java开发培训、Python培训、大数据工培训、软件测试培训等课程为一体的IT培训机构。
命令行工具开发:如何实现命令行提示?
阿里妹导读:对于稍微复杂一些的命令行工具,命令行的提示功能必不可少。那么对于不同语言的开发者,有没有一种简单快捷的实现方式呢?本文分享一种实现的方法,使用YAML文件定义命令行工具的使用规范,再通过工具自动生成各种shell的命令行提示脚本,较后分享一些至关重要的命令行解析器。
不少同学喜欢开发命令行工具,主要是开发快捷,而且和其他命令行工具配合,借助脚本,非常容易实现一些任务的自动化。命令行工具开发比较简单,以Java举一个例子,通常我们只需要一个命令行参数解析器,如Java,就有args4j, jopt,picocli等,转换为结构化的对象,根据输入的参数进行相关的逻辑判断,完成对应的逻辑。其他如Node.js, Deno, Python等,也是一样的流程,都有命令行参数解析器,然后基于命令行输入执行对应的逻辑。
一 命令行提示
如果命令行工具稍微复杂一些,那么必须要提供对应的命令行提示,不然开发者几乎没法使用。举一个例子,阿里云有对应的命令行工具aliyun-cli[1],下载安装后就可以使用aliyun命令行工具了。执行 aliyun --help,会发现非常多的子命令,如果没有命令行工具提示,开发者使用这个工具就非常复杂,要去查文档,或者通过命令行的help来输入命令。
aliyun的命令行工具也提供了对应的代码提示,如下所示:
这个命令行提示还不错,你只需要选择对应的子命令然后再进行提示就可以了。
大多数开发者喜欢带描述的命令行提示。并不是所有的子命令和命令参数都命名得非常好,如aliyun命令行给出的live子命令提示,大家可能完全不知道这个live是什么(当然,作为阿里云的同学,我还是知道的, live是视频直播)。而像如下包括描述的命令行提示就直观很多:
二 生成命令行提示
这里不再介绍bash,zsh,fish等各种shell的命令行提示的机制,没有人会手动编写这些命令行提示脚本,大家都会使用框架生成对应shell的命令行提示脚本。
我找了一些命令行解析框架,并且能自动生成命令行提示的,如Java的picocli,Node.js的commander.js,Python的argparse,以及Rust的clap-rs等。我都尝试了一下,较终发现还是clap-rs生成的命令行提示比较好,就是我说的那种带描述,而且还有文件名和目录自动提示,枚举值的提示等,关键是也非常简单。如果有同学有更好的命令行解析框架,希望能留言分享一下。
那么如何让其他语言,如Node.js,Java,Python这些语言编写的命令行工具也能实现和clap-rs的命令行提示一样的效果呢?
三 clap-rs的命令行YAML文件
clap-rs包含了一个命令行工具的YAML规范。我们都知道命令行工具交互比较简单,主要就两个部分:参数和子命令。你看到类似 --conf xxx.yaml 这些带参数名的都属于参数,也可以省略参数名,如 convert a.jpg a.png 其中的a.jpg和a.png也都是参数。子命令就比较容易理解了,我们每天使用的git就是大量使用子命令的,如 git add xxx.jpg 这些。当子命令还可以继续套用子命令,子命令同时也拥有自己的参数。
基于命令行这样的特性,我们完全可以将命令行工具的使用规范通过YAML描述出来,现在一切皆可YAML。
这里我给出一个阿里云命令行工具的YAML定义,当然只是demo。如下:
name: aliyun2 version: "0.1.0" about: "cli for Alibaba Cloud" args: - version: short: v long: version takes_value: false about: Display version subcommands: - oss: about: 对象存储 subcommands: - cat: about: cat文本文件 args: - file: takes_value: true required: true about: 文件名称 - ls: about: list文件 - ecs: about: 云服务器 subcommands: - SendFile: about: send file - AddTags: about: add tags
可以看出,我首先定义了两个子命令:oss和ecs,然后oss子命令下我又定义了两个子命令:cat和ls。对于oss的cat子命令,我又添加了file这个参数,这样我就可以使用cat来查看oss上文本文件的内容。
有了这个命令行工具YAML规范定义后,我就可以调用clap-rs提供的命令行工具接口,生成对应的shell的提示脚本。
这个命令行提示的效果是不是比原先的要好多了?提示有了描述,选择子命令和参数的时候就简单多了。
四 为所有命令行工具写YAML
讲到这里,相信大家都明白了。无论这个工具是Java,Python,Node.js还是Rust编写的,首先定义好该工具的YAML规范,接下来开发人员根据该规范去编写代码,他可以选择他喜欢的语言,他喜欢的命令行解析器,然后实现对应的功能即可。没有代码提升,编写YAML文件不出错是非常难的,所以我做了一个JSON Schema[2]文件,在编写YAML文件时可以进行代码提示,做到编写命令行YAML规范文件更加简单。
接下来我们会基于该YAML文件,为各种shell生成对应的命令行提示脚本,如bash,zsh,fish和powershell,这样分开后,开发人员也不需要去处理那些他不清楚的命令行提示,或者找该编程语言对应的SDK来做命令行代码提示。如果没有怎么办?即便有了,生成的提示非常简单怎么办?毕竟命令行工具提示非常重要。
相信Node.js的开发者也不希望还要学习一下Rust和clap-rs,这样就太不了。因此我又编写了一个工具cli-completion[3], 其主要目的根据上面说的YAML文件帮你自动生成各种shell的命令行提示脚本。来看一下zsh的例子:
$ cli-completion --zsh commands/aliyun2.yaml > /usr/local/share/zsh/site-functions/_aliyun2 $ autoload -U compinit && compinit
再看一下oh-my-zsh的例子:
$ mkdir ~/.oh-my-zsh/custom/plugins/aliyun2 $ cli-completion --zsh aliyun2.yaml > ~/.oh-my-zsh/custom/plugins/aliyun2/_aliyun2
通过这种方式,cli-completion可以为任何命令提供命令行提示。也就是说,以后,你只要编写命令行逻辑,关于命令行提示的问题,全部交给cli-completion帮你生成即可。当然考虑到用户体验,你可能需要在命令行工具中,将cli-completion生成的脚本,通过某一子命令,同步到客户端环境。
命令行的开发流程:YAML规范编写,命令行提示自动生成,开发人员下班前完成功能实现。
有同学可能会问,我能否基于YAML文件,并结合某一命令行解析框架,自动完成整个应用的骨架生成,这完全可以,开发人员只要实现一些函数即可,开发会更简单。我个人认为使用PicoCli这些框架自动生成代码,是完全没有问题的。
五 将cli-completion FaaS化
这个功能大家一年都未必用上两次,费时安装也挺麻烦的。现在不是到处都是FaaS,我们也可以尝试一下。首先cli-completion是用Rust编写的,所以可以用传统的方式编写Rust Cloud Lambda,然后部署到云服务上,另外也可以写一个Rust Web应用,如用actix-web,也非常简单。
这些都不够时髦,我们打算将cli-completion的代码WebAssembly化,然后以FaaS方式部署,这里我选择CloudFlare作为FaaS的运行平台。让我们来看一下Demo。
创建一个cli.yaml文件,如下:
name: cli1 version: "0.1.0" about: "CLI completion for bash, zsh, fish and powershell." args: - help: short: h long: help takes_value: false about: Display this help
然后调用cli-completion的FaaS服务,就可以得到对应的命令行提示脚本代码。命令如下:
curl -H 'Content-Type: application/x-yaml' --data-binary "@cli.yaml" https://cli-completion.linux-china.workers.dev/completion/zsh
对比传统的cloud lambda或者cloud function,这种方式FaaS响应速度较快,这种服务调用次数非常少,基本就是每次请求都是冷启动,而WebAssembly这方面就非常有优势。
当然还有一个较大的原因:就是WebAssembly方式的FaaS,它较便宜。
题外话探讨一下cloudflare的WebAssmebly的实现,纯技术讨论,代码如下:
async function handleRequest(request) { const { greet } = wasm_bindgen await wasm_bindgen(wasm) const greeting = greet() return new Response(greeting, {status: 200}) }
上述代码中,wasm是一个WebAssembly.Module对象,它是从外部注入的,而不是开发者写的,是FaaS生成的。接下来就是从wasm_bindgen这个函数中获取wasm的导出函数,然后调用wasm_bindgen(wasm) 将greet函数和wasm module中的export函数进行关联,然后调用greet就会转到wasm module的调用。如果是这样的话,WebAssembly.Module其实是可以外部管理的,当有请求时,再和JavaScript的函数进行关联,这样就可以增加WebAssembly的响应。
六 总结
以后大家在写命令行工具时,不用再担心代码提示的问题了。在动手开发工具前,写一下YAML文件,整理和厘清一下你的思路,有哪些子命令,有哪些参数等,然后再基于该YAML文件进行开发,使用什么语言都没有关系,较后配合cli-completion完成命令行提示,你的命令行工具算是相当专业的了,至少从面子上看起来是的 :)
较后列出一些命令行应用涉及的至关重要的命令行解析器,方便大家后续参考:
Java:Picocli, JCommander, JOpt, kotlinx-cli, JLine, args4j
Node.js:Commander.js, clap.js, minimist, yargs[4]
Deno:yargs
Python:argparse, docopt, cli-args, clap
Golang:argparse, flaggy
Rust:clap-rs, pico-args, paw
Ruby:cmdparse, commander, GLI
C++:gflags, cli, docopt.cpp
整理的不全,欢迎大家补充 :)
学Java全栈,就业前景广阔
Java学员就业平均薪资
Java学员2019年8月 |
|
Java学员2019年7月 |
|
Java学员2019年6月 |
|
Java学员2019年5月 |
10823元 就业平均薪资 |
|
10541元 就业平均薪资 |
|
9540元 就业平均薪资 |
|
10543元 就业平均薪资 |
查看本月数据 |
|
查看本月数据 |
|
查看本月数据 |
|
查看本月数据 |
|
|
|
|
|
|
|
Java学员2019年4月 |
|
Java学员2019年3月 |
|
Java学员2019年2月 |
|
Java学员2019年1月 |
12750元 就业平均薪资 |
|
10642元 就业平均薪资 |
11400元 就业平均薪资
|
|
10815元 就业平均薪资 |
|
查看本月数据 |
|
查看本月数据 |
|
查看本月数据 |
|
查看本月数据 |
Java开发核心技术实战
|
|
|
电商平台搭建 |
|
分布式项目实战 |
从0开始,完成整个电商平台的开发,学习开发基本流程。 |
|
Dubbox分布式调用技术,学习zookeepr分布式应用协调服务,学习分布式系统的应用场景。 |
|
|
|
|
|
|
高并发项目实战 |
|
微服务技术实战 |
NoSQL的实战,高并发方案以及具体的实现 |
|
学习SpringBoot框架以及SpringCloud微服务架构学习微服务搭建开发流程 |
|
|
|
领取完整课程大纲 |
优就业&太极共建Java名企直聘班
关于太极
太极计算机公司成立于1987年,国有控股上市企业,大型IT综合性信息系统产品服务提供商, 是中国首批进入"火炬计划软件产业基地"的骨干企业之一,曾任铁道部12306“新一代客票系统一期工程项目”升级运营商。
关键领域和重要行业重大信息系统总体建设单位
|
|
优就业与太极共建Java名企直聘班,双方整合优势资源,借助太极计算机公司的技术实力和生产平台, 帮助优就业培训学员锻炼实战能力。同时,持续为课程输出前沿技术,让企业成为学员的实践、就业平台,共同培育高素质IT人才。 |
太极投入IT研发技术和团队,由集团工程师手把手带学员项目实训。 实训结束后有机会直接留在太极或者推荐到北软会员单位 结业之后可从事软件开发岗、技术支持岗两个方向 |
尊重原创文章,转载请注明出处与链接:http://www.peixun360.com/news/331647/违者必究! 以上就是重庆中公优就业IT培训机构 小编为您整理重庆学Java培训机构去哪专业的全部内容。