使用 Grails 1.3 管理插件

工程 | Peter Ledbrook | 2010年5月18日 | ...

长期以来,管理 Grails 依赖项仅仅意味着将它们放在应用程序的lib目录中。然后是 Grails 1.2 和依赖项 DSL:你终于可以声明你的依赖项,让 Grails 自动下载它们并使其可供你的应用程序使用。太棒了!

现在,Grails 1.3 将依赖项 DSL 带入了插件领域。

那又怎样?

到目前为止,用户在使用插件系统时经常面临两个问题
  1. 设置一个合适的 Subversion 服务器作为 Grails 插件仓库并不简单;并且
  2. 你无法控制插件会给你的应用程序带来哪些依赖项。
第一个问题对个体开发者来说并不特别适用,但对于那些互联网访问可能受限或希望更好地控制库和插件“最新”版本的公司来说,这是一个更大的问题。如果他们能使用像 NexusArtifactory 这样的仓库管理器,那该多好啊。

至于依赖项,有些插件包含你不需要的库,甚至(更糟糕的是)会破坏你的应用程序。使用依赖项 DSL,你可以明确排除有问题的库。

这些就是这个变化可能对你很重要的原因。那么,你如何使用这个新功能呢?

依赖项两步法

要充分展示 Grails 依赖管理器的实用性,我们必须建立一个本地仓库。本文中,我们将使用 Artifactory。你也可以同样使用 Nexus 或任何其他创建 Maven 兼容仓库的工具。

我假设 Artifactory 已经安装并正在运行 - 有关达到此阶段的详细信息,请查看其网站,特别是“一分钟 Artifactory”截屏视频。此时我们有了一个本地仓库,但它尚未提供任何构件。我们来解决这个问题。

我将添加 'db-util' 插件和 'commons-digester' 库。你可以尝试使用任何可用的插件或 JAR 包。只需导航到 Artifactory 的 'Deploy' 选项卡(使用用户名 "admin"、密码 "password" 登录),选择相应的文件,然后上传。我获取了这些文件

    $USER_HOME/.ivy2/cache/commons-digester/commons-digester/jars/commons-digester-2.0.jar
    $USER_HOME/.grails/1.2.1/plugins/db-util-0.4.zip

并通过 Artifactory UI 添加了它们:

注意,UI 允许你指定上传的目标仓库。我为 'db-util' 插件选择了 'plugins-releases-local',为 'commons-digester' 选择了 'libs-releases-local'。此外,在提交插件构件之前,我将其 groupId 设置为 'org.grails.plugins',将其 artifactId 设置为 'db-util'(默认值都是 'grails-db-util')。'org.grails.plugins' groupId 是 Grails 对插件依赖项所假设的值。还要注意 artifactId 如何不包含“grails-”前缀。

这两个构件现在本地可供你的任何 Grails 应用程序使用。现在我们需要在 Grails 应用程序中配置仓库和依赖项。

依赖项 DSL

接下来的部分出奇地简单。我们需要做两件事
  1. 配置 Grails 从我们的 Artifactory 仓库下载插件和 JAR 包;以及
  2. 指定我们的依赖项。
与 Grails 1.2 一样,这在grails-app/conf/BuildConfig.groovy中完成。以下是示例 Grails 应用程序中的相关部分
grails.project.dependency.resolution = {
    ...
    log "warn"
    repositories {
        grailsPlugins()
        grailsHome()
        mavenRepo "http://localhost:8081/artifactory/libs-releases-local/"
        mavenRepo "http://localhost:8081/artifactory/plugins-releases-local/"
        grailsCentral()
    }
    plugins {
        build "org.grails.plugins:db-util:0.4"
    }
    dependencies {
        compile "commons-digester:commons-digester:2.0"
    }
}

因此,在repositories部分中,你为 Artifactory 服务器公开的每个“仓库”添加一个mavenRepo条目。注意,在这种情况下,我们同时添加了 'libs-releases-local' 仓库和 'plugins-releases-local' 仓库。

DSL 的新添部分是plugins部分,(毫不意外地)用于声明 Grails 插件。它的语法与dependencies部分完全相同。因此,'db-util' 声明在plugins下,而 'commons-digester' 声明在dependencies.

下。就这样了。如果你现在执行grails run-app,你将看到类似以下的输出

...
Resolving dependencies...
Downloading: http://localhost:8081/artifactory/libs-releases-local/commons-digester/commons-digester/2.0/commons-digester-2.0.pom ...
Download complete.
Downloading: http://localhost:8081/artifactory/libs-releases-local/commons-digester/commons-digester/2.0/commons-digester-2.0.pom.sha1 ...
Download complete.
...
Downloading new plugins. Please wait... ...
Downloading: http://localhost:8081/artifactory/plugins-releases-local/org/grails/plugins/db-util/0.4/db-util-0.4.pom ...
Download complete.
Downloading: http://localhost:8081/artifactory/plugins-releases-local/org/grails/plugins/db-util/0.4/db-util-0.4.pom.sha1 ...
Download complete.
Downloading: http://localhost:8081/artifactory/plugins-releases-local/org/grails/plugins/db-util/0.4/db-util-0.4.zip ...
Download complete.
Downloading: http://localhost:8081/artifactory/plugins-releases-local/org/grails/plugins/db-util/0.4/db-util-0.4.zip.sha1 ...
Download complete.
Installing zip /home/pal20/.ivy2/cache/org.grails.plugins/db-util/zips/db-util-0.4.zip...
...

'db-util' 插件已安装,'commons-digester' JAR 包已包含在 classpath 中。简单。

如果你遇到依赖项解析问题,则可以通过将 BuildConfig.groovy 中的log "warn"行替换为log "info"甚至log "debug".

来提高日志级别。当然,有时你会想托管自己的插件或公共插件的定制/修补版本。现有的release-plugin命令只适用于旧式的 Subversion 仓库,那么你能做些什么呢?

发布插件到 Maven 兼容仓库

Grails 核心在此方面没有提供帮助,但也不需要。有一个专门用于将 Grails 应用程序和插件发布到 Maven 兼容仓库的 Grails 插件:Maven Publisher Plugin

在你的插件项目中安装此插件,并在 BuildConfig.groovy 文件中添加以下条目

grails.project.dependency.distribution = {
    remoteRepository(id: "pluginSnapshots", url: "http://localhost:8081/artifactory/plugins-snapshots-local/") {
        authentication username: "admin", password: "password"
    }
}

然后运行 grails maven-deploy --repository=pluginSnapshots 大功告成!你的插件将被部署到本地 Artifactory 的 'plugins-snapshots-local' 仓库,其 groupId 为org.grails.plugins。注意,你为--repository参数传递的值应与 BuildConfig.groovy 中grails.project.dependency.distribution闭包中定义的远程仓库的 'id' 相匹配。

你可以微调部署,例如通过使用包含<distributionManagement>元素的 pom.xml 文件,或者通过向插件描述符添加一个groupId属性,但基本步骤都很简单。

剩下要解释的是依赖项信息存储在哪里。例如,普通构件(如 JAR 库)的依赖项存储在像 pom.xml 这样的元数据文件中。Grails 插件不同。它们的 JAR 依赖项位于 zip 包内部的一个 dependencies.groovy 文件中。至于插件依赖项,你像以前一样在插件描述符的dependsOn字段中定义它们。然后,这些依赖项会被转换为你的插件生成的 pom.xml 文件中的依赖项声明(该文件与插件 zip 文件一起存储在仓库中)。

而这确实就是全部了。现在你可以提供自己的、易于管理的 Maven 兼容仓库,这样你的团队成员就不必每次需要插件或依赖项时都访问互联网。你还可以通过控制哪些版本的 Grails 插件可用,为你的项目注入一些一致性。而且,你可以轻松修补公共插件,并在等待官方版本发布修复的同时,在本地提供这些版本给你的团队。

获取 Spring 新闻通讯

订阅 Spring 新闻通讯,保持联系

订阅

先行一步

VMware 提供培训和认证,助你飞速进步。

了解更多

获取支持

Tanzu Spring 提供对 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件,只需一份简单订阅。

了解更多

即将举行的活动

查看 Spring 社区所有即将举行的活动。

查看全部