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…

767 重构字符串_重构字符串型系统

767 重构字符串去年&#xff0c;我加入了一个项目&#xff0c;该项目从另一个软件公司接手&#xff0c;但未能满足客户需求。 如您所知&#xff0c;在“继承”的项目及其代码库中&#xff0c;有许多事情可以并且应该加以改进。 可悲的是&#xff08;但并不奇怪&#xff09;领域…

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…

oracle怎么读取表空间文件大小,oracle获取表空间文件大小

oracle通过查询DBA_SEGMENTS表获取表空间文件信息&#xff0c;包括表空间名称&#xff0c;大小等 ? 1 select tablespace_name,sum(max_size),sum(bytes) from dba_segments group by tablespace_name; max_size和bytes的单位是字节。将上面的sql语句放到存储过程中执行&#…

java 枚举内嵌枚举_高度有用的Java ChronoUnit枚举

java 枚举内嵌枚举几年前&#xff0c;我发表了博客文章“ The Highly有用的Java TimeUnit Enum ”&#xff0c;其中介绍了JDK 5引入的TimeUnit枚举。 JDK 8引入了一个更新的枚举ChronoUnit &#xff0c;它比TimeUnit更适合于并发以外的上下文&#xff08;例如日期/时间操作&…

Chrome for Mac OS 的 快捷键

文章目录页面滚动其它页面滚动 快捷键功能说明Command ↑滚动到网页的顶部Command ↓滚动到网页的底部 其它 快捷键功能说明Shift Command [ 或 Shift Command ]左右切换标签页&#xff0c;到最后一个会重新循环Option Command ← 或 Option Command →左右切换标签页…

oracle分页包,Oracle分页获取数据的实现 (包和存储过程)

本文档主要是介绍针对oracle数据库中利用包和存储过程来实现分页获取数据的内容。其实该存储过程的主题思想及主要实现我也是从网上找的&#xff0c;自己做了整合。包括包头声明和包体实现部分以及C#代码具体调用部分&#xff0c;共大家参考并提出改进意见。本包中包括两个分页…

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 下 …

oracle查询file_name,Oracle DG环境下db_file_name_convert的实际意义

关于DG环境下备库数据文件重命名的问题&#xff1a;**前言:**主要想表明DG环境下备库数据文件重命名的问题&#xff0c;以及db_file_name_convert与log_file_name_convert的作用。**实验证明&#xff1a;**主库为备库备份一份控制文件RMAN> backup current controlfile for …

python收集数据程序_用一行Python代码进行数据收集探索!Python真牛逼!

简易的Pandas之路 任何使用P ython数据的人都会熟悉Pandas包。P andas是大多数行和列格式数据的go-to包。 如果你没有Pandas&#xff0c;请确保在终端中使用pip install安装&#xff1a; pip install pandas 现在&#xff0c;让我们看看Pandas包中的默认方法可以做些什么&#…

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

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

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

文章目录从 sysvinit 到 systemd什么是 init 系统,init 系统的历史和现状sysvinit 概况运行级别sysvinit 运行顺序sysvinit 和系统关闭sysvinit 的管理和控制功能haltinitkillall5lastlastbmesgpidofpoweroffrebootrunlevelshutdownsulogintelinitutmpdumpwallsysvinit 的小结从…

php /usr/lib/libjpeg.so.62,linux PHP的装配

linux PHP的安装2. 红帽Linux PHP2.1. 安装linux PHP查看系统是否自带了php&#xff0c;若自带先卸载&#xff0c;否则安装后会出错。(1)下载php源文件php-5.3.6.tar.gz&#xff0c;地址为http://cn2.php.net/downloads.php(2)执行如下命令&#xff0c;解压源文件&#xff0c;以…

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

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

代码注释掉还能执行_日志消息是可执行代码和注释

代码注释掉还能执行尽管在一个人的代码中应添加多少注释之间存在意见分歧&#xff0c;但我认为可以肯定地说&#xff0c;大多数开发人员都同意以下代码段中的注释是多余的&#xff1a; // increment the total total;在该示例中&#xff0c;代码很简单&#xff0c;而且实际上是…