使用Groovy作为脚本语言

1wnzp6jl  于 2023-03-07  发布在  其他
关注(0)|答案(7)|浏览(170)

我更喜欢使用脚本语言来完成短任务,比如一个非常简单的http bot,批量导入/导出数据到某个地方,等等...基本的一次性脚本和简单的东西。关键是,脚本语言只是一个高效的工具来编写快速的程序。至于我对Groovy的理解...
如果你要用Groovy编程,而你不想写一个快速的脚本,你不会被迫回到常规的java语法吗(我们知道与脚本语言相比,这是多么复杂),以便做更复杂的事情?例如,如果我想做一些http脚本,我不应该回到使用java语法调用Commons HttpClient吗?对我来说,脚本语言的要点是快速输入和较少强制的构造。还有一件事,当已经有这么多优秀的java库时,似乎没有任何动机开发基于groovy的库,从而使groovy看起来像是一种依赖于Java的语言,只有很少的脚本功能。
因此,现在我想知道我是否可以改用Groovy作为脚本语言,或者继续使用更常见的脚本语言,如Perl、Python或Ruby。

izkcnapc

izkcnapc1#

@僵尸们,我给大家举一个我最近写的一个剧本的小例子:

def fetch(build, toFile) {
    new FTPClient().with {
        connect ftpServer
        enterLocalPassiveMode()
        login ftpUser, ftpPassword
        changeWorkingDirectory "/var/staging/revision-${build}"
        fileType = FTPClient.BINARY_FILE_TYPE
        toFile.withOutputStream { ostream -> 
            retrieveFile "build-${build}.zip", ostream 
        }
        disconnect()
    }
}

它使用了commons-net API,但是我想你会同意它比类似的Java程序有更清晰的语法。所以我不认为使用Java API会破坏脚本语言的目的。此外,它可以帮助你利用你现有的Java API知识,这是一个非常实用的方法。

a5g8bdjr

a5g8bdjr2#

Groovy的一个目标是与Java透明地互操作。Groovy被设计成"一种具有脚本功能的依赖于Java的语言"。然而,我不认为这些功能是次要的-Groovy有许多静态编程语言(如Java)所没有的功能。
总结如下:如果您根本不关心Java,那么可以使用更通用的脚本语言,如Python或Perl。如果您希望以脚本式的方式使用Java代码库,Groovy是一个不错的选择。

tpxzln5u

tpxzln5u3#

Groovy对于编写脚本非常方便。最近我需要一个脚本来将Maven依赖项提取到lib目录中,最后得到了一个Groovy脚本。这个代码片段解析一个pom,并为您提供一个jar列表。对于XML解析来说,这真是太棒了!

#!/usr/bin/env groovy
def pom = new XmlSlurper().parse('pom.xml')
def repo = "${System.env.HOME}/.m2/repository"

pom.dependencies.dependency.each { dep ->
    def jarName = "${dep.artifactId}-${dep.version}.jar"
    def groupPath = dep.groupId.text().replaceAll('\\.', '/')
    def jarPath = "${repo}/${groupPath}/${dep.artifactId}/${dep.version}"
    println "$jarPath/$jarName"
}
7rfyedvj

7rfyedvj4#

例如,如果我想做一些http脚本,我不应该回到使用java语法调用Commons HttpClient吗?
你会“马上回到使用Commons HttpClient”,但是你会使用Groovy语法而不是Java语法来调用它。Groovy语法比Java语法要紧凑得多,因此更适合脚本编写。换句话说,在Groovy中使用Java库比在Java中使用Java库需要的代码要少得多。
当已经有这么多好的javaone在那里的时候,似乎没有任何动机去开发基于groovy的库
Groovy库的作者通常不会开发一个全新的库,而是为现有的Java库提供一个“Groovier”API,例如Grails提供的Hibernate构建器和HTTP Builder(委托给Commons HttpClient)。
这些Groovy API提供了一种比直接使用JavaAPI更紧凑、更惯用的替代方法。

uujelgoq

uujelgoq5#

Groovy“开箱即用”将大量常见类替换为Groovier版本或语言构造,包括用于XML、HTTP请求、访问SQL数据库和正则表达式的类。(尽管您仍然可以选择)。但是如果您的脚本使用的是裸Java库,Groovy将远远超过纯Java,Groovy的闪光点在于“粘合”代码,比如设置数据结构和文件I/O。
Map和列表允许您创建Java兼容的列表和Map;与Java类一起工作的常规Java对象。Groovy经常将带有变量声明和初始化的多行Java方法调用转换为一行代码。
考虑下面这个简短的代码片段,将整个文件加载到String中:

def fileContents = new File(filename).text

对比

String fileContents = "";
try {
    BufferedReader reader = new BufferedReader(new FileInputStream(filename));
    String line = null;
    while ((line = reader.readLine()) != null) {
        text = text + line + "\n";
    }
} catch (IOException e) {
    e.printStackTrace();
}

异常处理在脚本中通常不是一个重要的考虑因素,可以方便地忽略它。
Groovy作为一种脚本语言的主要优势是可以直接方便地访问大量的Java代码库,如果您不需要这样做,Groovy仍然提供了一个与其他语言(如Perl、python或ruby)一样丰富的脚本环境。

nnvyjq4y

nnvyjq4y6#

Groovy Rocks,一旦你掌握了这种非常紧凑的语法,你就可以开始用它来做很多你刚刚用“慢方法”做过的事情。
前几天我参加了一个讨论,不知怎么的,我开始想知道在我们的一个系统中,一个GUID中有多少个字符。与其计算数字,不如这样做:

def str = '92228498-6A2F-DBA2-7A2C-F54B9E607E3A'
int num = 0
str.each {
    num++
}
println num

把它放在本地或共享脚本目录中,它将在未来存在。

iyzzxitl

iyzzxitl7#

仅用途:

error('bla bla bla bla')

脚本Jenkins中的示例:

// define vars
def env.TYPE_GESTAO = "VASCO"
def _MSSQL_FILE = "ALL_CHK.sql"
def _MSSQL_USER = "master"

// Start pipeline
pipeline {
    agent any

    stages {
        stage('Checking the envs with vars') {
            steps {
                script {
                    // Print Vars
                    print "_MSSQL_FILE -- ${_MSSQL_FILE}"
                    print "_MSSQL_USER -- ${_MSSQL_USER}"

                    // if
                    if (env.TYPE_GESTA.toUpperCase() == 'FLUMINENSE') {
                        _MSSQL_FILE = "SOMEFILE.sql"
                        _MSSQL_USER = "someuser"

                    // else if
                    } else if (env.TYPE_GESTA.toUpperCase() == 'FLAMENGO') {
                        _MSSQL_FILE = "SOMEFILE.sql"
                        _MSSQL_USER = "someuser"

                    } else {
                        print "---------"
                        error('RUN_MODE is not set. Set this var in project Jenkins.')
                    }

                    // Print Vars
                    print "-----------------------------"
                    print "_MSSQL_FILE -- ${_MSSQL_FILE}"
                    print "_MSSQL_USER -- ${_MSSQL_USER}"
                }
            }
        }

        stage('Checking something else STAGE') {
            steps {
                script {
                    print "END OF SCRIPT..."
                }
            }
        }
    }
}

相关问题