Picocli 2.0:类固醇上的Groovy脚本
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
總結
以上是生活随笔為你收集整理的Picocli 2.0:类固醇上的Groovy脚本的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DDOS攻击防御(精准防御ddos攻击)
- 下一篇: 安卓液晶电视的音频输出(安卓液晶电视)