groovy.run 脚本_Picocli 2.0:类固醇上的Groovy脚本

groovy.run 脚本

Picocli 2.0增加了对其他JVM语言(尤其是Groovy)的支持。 当Groovy语言具有CliBuilder类的内置CLI支持时,为什么还要使用picocli?

您可能喜欢picocli的使用帮助,默认情况下会显示ANSI 颜色和样式 。 您可能会喜欢的另一个功能是命令行TAB自动补全 。 最后,还有很多较小的功能,例如您的脚本需要零行的命令行解析代码,picocli的子命令支持,选项和位置参数的类型转换以及解析器跟踪等。

让我们看一个例子。 下面的checksum.groovy脚本采用一个或多个文件参数,并为每个文件打印出一个校验和和文件名。 默认情况下,“校验和”算法为MD5,但用户可以指定其他MessageDigest算法。 用户可以使用-h--help选项来请求使用帮助。

@Grab('info.picocli:picocli:2.0.3')
@picocli.groovy.PicocliScript
import groovy.transform.Field
import java.security.MessageDigest
import static picocli.CommandLine.*@Parameters(arity="1", paramLabel="FILE", description="The file(s) whose checksum to calculate.")
@Field File[] files@Option(names = ["-a", "--algorithm"], description = ["MD2, MD5, SHA-1, SHA-256, SHA-384, SHA-512,","  or any other MessageDigest algorithm."])
@Field String algorithm = "MD5"@Option(names= ["-h", "--help"], usageHelp= true, description= "Show this help message and exit.")
@Field boolean helpRequestedfiles.each {println MessageDigest.getInstance(algorithm).digest(it.bytes).encodeHex().toString() + "\t" + it
}

$picocli-home/examples/src/main/groovy/picocli/examples目录中运行时,此示例脚本将产生以下结果:

$ groovy checksum.groovy *.*
4995d24bbb3adf67e2120c36dd3027b7        checksum.groovy
a03c852de017f9303fcc373c7adafac6        checksum-with-banner.groovy
1ee567193bf41cc835ce76b6ca29ed30        checksum-without-base.groovy

使用-h--help选项调用脚本将显示以下ANSI颜色和样式的用法帮助消息:

代码在哪里?

您可能已经注意到,上面的脚本不包含任何用于解析命令行参数或处理使用帮助请求的逻辑。

没有@picocli.groovy.PicocliScript批注,脚本代码将如下所示:

class Checksum {@Parameters(arity = "1", paramLabel = "FILE", description = "...")File[] files@Option(names = ["-a", "--algorithm"], description = ["..."])String algorithm = "MD5"@Option(names = ["-h", "--help"], usageHelp = true, description = "...")boolean helpRequested
}
Checksum checksum = new Checksum()
CommandLine commandLine = new CommandLine(checksum)
try {commandLine.parse(args)if (commandLine.usageHelpRequested) {commandLine.usage(System.out)} else {checksum.files.each {byte[] digest = MessageDigest.getInstance(checksum.algorithm).digest(it.bytes)println digest.encodeHex().toString() + "\t" + it}}
} catch (ParameterException ex) {println ex.messagecommandLine.usage(System.out)
}

上面的示例包含显式代码,用于解析命令行,处理无效的用户输入以及检查使用帮助请求。 脚本的第一个版本没有任何此样板代码。

让我们看一下它是如何工作的。

底标

@picocli.groovy.PicocliScript注释的脚本会自动转换为使用picocli.groovy.PicocliBaseScript作为其基类。 这会将Groovy脚本变成基于picocli的命令行应用程序。

运行脚本时,Groovy会调用脚本的run方法。 PicocliBaseScript::run方法负责解析命令行并使用结​​果填充脚本字段。 run方法执行以下操作:

  • 首先,以@Option@Parameters注释的@Field变量是从命令行参数初始化的。
  • 如果用户输入无效,则会打印一条错误消息,然后显示用法帮助消息。
  • 如果用户请求使用帮助或版本信息,则将其打印到控制台并退出脚本。
  • 否则,将执行脚本主体。

可以自定义此行为,有关更多详细信息,请参见PicocliBaseScript javadoc 。

除了更改脚本基类, @PicocliScript批注还允许Groovy脚本直接使用@Command批注,而无需引入帮助程序类。 picocli解析器将在包含@Option@Parameters注释字段的类上寻找此注释。 更改脚本基类的同一自定义AST转换还将脚本中的任何@Command注释都移动到此转换后的类,以便picocli解析器可以将其拾取。

颜色的使用帮助

@Command注释使您可以自定义用法帮助消息的各个部分,例如命令名称,描述,页眉,页脚等。

让我们在示例脚本中添加一些麻烦。 (对于ASCII Art Generator,请登录http://patorjk.com/software/taag/ 。)

@Grab('info.picocli:picocli:2.0.3')
@Command(header = [$/@|bold,green    ___                            ___ _           _                  |@/$,$/@|bold,green   / __|_ _ ___  _____ ___  _     / __| |_  ___ __| |__ ____  _ _ __  |@/$,$/@|bold,green  | (_ | '_/ _ \/ _ \ V / || |   | (__| ' \/ -_) _| / /(_-< || | '  \ |@/$,$/@|bold,green   \___|_| \___/\___/\_/ \_, |    \___|_||_\___\__|_\_\/__/\_,_|_|_|_||@/$,$/@|bold,green                         |__/                                         |@/$],description = "Print a checksum of each specified FILE.",version = 'checksum v1.2.3', showDefaultValues = true,footerHeading = "%nFor more details, see:%n",footer = ["[1] https://docs.oracle.com/javase/9/docs/specs/security/standard-names.html","ASCII Art thanks to http://patorjk.com/software/taag/"]
)
@picocli.groovy.PicocliScript
import groovy.transform.Field
import java.security.MessageDigest
import static picocli.CommandLine.*@Parameters(arity="1", paramLabel="FILE", description="The file(s) whose checksum to calculate.")
@Field private File[] files@Option(names = ["-a", "--algorithm"], description = ["MD2, MD5, SHA-1, SHA-256, SHA-384, SHA-512, or","  any other MessageDigest algorithm. See [1] for more details."])
@Field private String algorithm = "MD5"@Option(names= ["-h", "--help"], usageHelp=true, description="Show this help message and exit.")
@Field private boolean helpRequested@Option(names= ["-V", "--version"], versionHelp=true, description="Show version info and exit.")
@Field private boolean versionInfoRequestedfiles.each {println MessageDigest.getInstance(algorithm).digest(it.bytes).encodeHex().toString() + "\t" + it
}

脚本的新版本添加了页眉和页脚,以及打印版本信息的功能。 使用帮助消息和版本信息中显示的所有文本都可能包含格式说明符,例如%n行分隔符。

使用帮助消息还可以显示ANSI颜色和样式。 Picocli支持简单的标记语法,其中@| 开始一个ANSI样式的节, |@结束它。 立即跟随@| 是用逗号分隔的颜色和样式列表,例如@|STYLE1[,STYLE2]…​ text|@ 。 有关可用颜色和样式的详细信息,请参见picocli 用户手册 。

新脚本的用法帮助消息如下所示:

@Command批注还具有version = "checksum v1.2.3"属性。 当用户指定该版本字符串印刷--version在命令行上,因为我们声明的@Option带属性,该属性名称versionHelp = true

$ groovy checksum-with-banner.groovy --version
checksum v1.2.3

有关更多详细信息,请参见用户手册的“ 版本帮助”部分。

结论

@PicocliScript批注允许Groovy脚本省略样板代码,同时添加强大的通用命令行应用程序功能。 在示例脚本的最终版本中,大多数代码实际上是使用帮助消息的描述文本。

picocli还有很多其他功能,请尝试一下!

如果愿意,请在GitHub上为项目加注星标,然后告诉您的朋友!

翻译自: https://www.javacodegeeks.com/2018/01/picocli-2-0-groovy-scripts-steroids.html

groovy.run 脚本

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/334331.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux 系统服务管理和控制程序(初始化系统/Init System) -- systemd 介绍

文章目录systemd 简介systemd 启动过程概述Systemd的争议systemd 简介 开发systemd的主要目的就是减少系统引导时间和计算开销。systemd&#xff08;系统管理守护进程&#xff09;&#xff0c;最开始以GNU GPL协议授权开发&#xff0c;现在已转为使用GNU LGPL协议&#xff0c;…

mongodb msi安装包_跟我快速学数据存储:MongoDB非关系型数据库

想要学习更多编程&#xff0c;就点上方蓝字关注我们MongoDB概述01与Redis半持久化&#xff0c;存储于内存和硬盘不同&#xff0c;MongoDB是直接持久化&#xff0c;存储于硬盘的缓存系统。MongoDB非常流行&#xff0c;其中阿里云提供了云数据库MongoDB版。https://blog.csdn.net…

php页面 info,通过PATH_INFO方法实现页面伪静态_php

/*函数url_parse用于解析url&#xff0c;使用时需要在前面定义define(PATH_INFO,true);需要解析时调用该函数&#xff0c;取值方法用回$_GET[xxx]即可*/function url_parse(){if(!(isset($_SERVER[PATH_INFO])&&defined(PATH_INFO))){return;}$url substr($_SERVER[PA…

fanuc roboguide_FANUC机器人虚拟仿真教程:Roboguide弧焊仿真工作站工装添加

Roboguide软件左侧浏览树中的“Fixture”节点专门用于添加工装资源&#xff0c;软件支持添加自带的库文件数模以及外部导入的CAD数模。软件支持CSB、DXF、STL、IGES、3DS等格式数模文件&#xff0c;一般情况下将将外部数模转换为IGES或CSB格式后进行导入效果会更好一些。本期&a…

如何在 Ubuntu 14.04 和 12.04 上测试 systemd

本来&#xff0c;Ubuntu决定从Ubuntu 16.04 LTS开始使用systemd来替换当前的引导过程。Ubuntu 16.04预计在2016年4月发布&#xff0c;但是考虑到systemd的流行和需求&#xff0c;刚刚发布的Ubuntu 15.04采用它作为默认引导程序。另外&#xff0c;Ubuntu 14.04 Trusty Tahr和Ubu…

python-opencv 最快的遍历颜色空间_居住空间设计的七种设计风格

生活中每家每户的家居样式都是不一样的&#xff0c;它们都是各有各的风格。在居住空间设计中&#xff0c;设计师会根据居住者的风格喜好来定制相应的设计方案&#xff0c;以及融入设计师的风格特点来创造出独特的设计风格&#xff0c;那么让我看看都有哪些设计风格吧。传统风格…

java更好的语言_五个使Java变得更好的功能

java更好的语言我偶然发现了Brian Goetz 提出的有关Java数据类的建议 &#xff0c;立即意识到我也对如何使Java更好地成为一种语言有一些想法。 我实际上有很多&#xff0c;但这只是五个最重要的简短列表。 专制&#xff08;2006&#xff09;&#xff0c;迈克贾奇&#xff08;…

Linux 初始化系统(系统服务管理和控制程序/Init System) -- System V init(SysV init) 的简单理解

文章目录SysV init 简介SysV init 的缺点运行级别主要文件和目录的截图SysV init 简介 System V init&#xff08;缩写 SysV init&#xff09;是类 Unix 操作系统中传统的也是首款初始化系统。 服务配置文件&#xff08;bash 脚本文件&#xff09;存放在目录 /etc/init.d 下 …

java使用缓冲区读取文件_在Java中使用Google的协议缓冲区

java使用缓冲区读取文件最近发布了 有效的Java第三版 &#xff0c;我一直对确定此类Java开发书籍的更新感兴趣&#xff0c;该书籍的最新版本仅通过Java 6进行了介绍 。 在此版本中&#xff0c;显然存在与Java 7 &#xff0c; Java 8和Java 9密切相关的全新项目&#xff0c;例如…

linux多用户运行同一程序_linux系统中CentOS有哪些优势,让它长盛不衰?

CentOS是目前评价和口碑都不错的linux系统&#xff0c;甚至很多公司安装的都是CentOS系统&#xff0c;对于初入门的小白可能不了解这个系统&#xff0c;今天我们就整理一下CentOS系统的七大优势。1. 开源、免费众所周知&#xff0c;不管是微软的 Windows 还是苹果的 macOS&…

浅析 Linux 初始化系统(系统服务管理和控制程序/init system) -- UpStart

文章目录一、Upstart 简介&#xff08;一&#xff09;开发 Upstart 的缘由&#xff08;二&#xff09;Upstart 的特点二、Upstart 概念和术语&#xff08;一&#xff09;Job&#xff08;二&#xff09;Job 生命周期&#xff08;三&#xff09;事件 Event1.Signals2.Methods3.Ho…

telnet到设备里 php_金融行业思科设备典型网络故障案例:76系列典型案例(一)...

一、Cisco 7606主备引擎自动切换01故障现象某行上联路由器cisco7606 x月x日引擎自行切换&#xff0c;这种情况是第一次发生&#xff0c;至今仍是备引擎是active&#xff0c;主引擎是standby。02分析过程思科TAC提取了log日志和crashinfo信息&#xff1a;Previous engine detect…

白盒测试方法静态分析_静态分析的教育方面

白盒测试方法静态分析加入我们项目的新程序员经常问我们是否有自动格式化工具&#xff0c;以使Java代码看起来完全像Qulice期望的那样。 &#xff08;Quili是我们使用的静态分析器。&#xff09;我总是回答说&#xff0c;拥有这样一个自动代码抛光器只会有害&#xff0c;并且不…

java javadoc_使用Java 9向Javadoc搜索添加术语

java javadoc有一个相对较旧的网页&#xff0c;称为“ Proposed Javadoc Tags ”&#xff0c;最初似乎是与Javadoc 1.2一起编写的&#xff0c;其中列出了“ Sun有朝一日可能会在Javadoc中实现的标签”。 在此列表中的标签是category &#xff0c; example &#xff0c; tutoria…

浅析 Linux 初始化系统(系统服务管理和控制程序/Init System) -- systemd

文章目录一、Systemd 的简介和特点&#xff08;一&#xff09;同 SysVinit 和 LSB init scripts 兼容&#xff08;二&#xff09;更快的启动速度&#xff08;三&#xff09;systemd 提供按需启动能力&#xff08;四&#xff09;Systemd 采用 Linux 的 Cgroup 特性跟踪和管理进程…

查询 service monitor 时发生内部错误_通过Service访问应用 (1)

目录通过Service访问应用通过Pod IP访问应用 通过ClusterIP Service在集群内部访问 通过Service访问应用通过之前的操作&#xff0c;应用部署完成了&#xff0c;我们的Demo网站已经成功启动了&#xff0c;那么如何访问网站呢&#xff1f;通过Pod IP访问应用我们可以通过Pod IP来…

c语言 方程改main的值_C语言编程笔记丨编写第一个C语言程序hello world,我教你哇...

如果用C语言输出&#xff1a;Hello&#xff0c;world&#xff01;&#xff0c;该如何编写程序&#xff1f;**代码如下&#xff1a;**#include//包含标准库的信息main()//定义名为main的函数&#xff0c;不接受参数值{//main函数的语句都放在花括号中&#xff0c;也表示函数体的…

linux定时创建文件,linux下如何创建定时任务

文/PM回忆录本篇文章不详细讲述cron服务的那种配置文件&#xff0c;只是应用层面的讲解&#xff0c;只求初步的掌握。说到定时任务&#xff0c;不能不介绍下cron&#xff1a;一、cron定时任务是什么在LINUX中&#xff0c;周期执行的任务一般由cron这个守护进程来处理[ps -ef|gr…

6-7 使用函数输出水仙花数_「Java」再议printf函数

System.out.printf() 是在JDK1.5版开始引入的方法&#xff0c;即在JDK1.5以后的版本才可以使用此函数&#xff0c;printf 方法有 printf(String format, Object ... args) 和 printf(Locale l, String format, Object ... args) 两种重载方式。其实学过C语言的小伙伴应该会觉得…

c语言命名规则_C语言的基本数据类型及变量

学习目标了解C语言的基本数据类型了解变量的基本概念了解变量的使用方法了解了变量的命名方法了解格式占位符了解变量的输出了解C语言程序的基本数据类型及概念的使用方法擦在C语言编程中&#xff0c;系统定义了多种数据类型&#xff0c;本节将讲解基本数据类型的分类。基本数据…