使用 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 假定用于插件依赖项的 groupId。还请注意,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 "https://:8081/artifactory/libs-releases-local/"
        mavenRepo "https://:8081/artifactory/plugins-releases-local/"
        grailsCentral()
    }
    plugins {
        build "org.grails.plugins:db-util:0.4"
    }
    dependencies {
        compile "commons-digester:commons-digester:2.0"
    }
}

所以,在仓库部分,您为 Artifactory 服务器提供的每个“存储库”添加一个mavenRepo条目。请注意,在本例中,我们同时添加了 'libs-releases-local' 存储库和 'plugins-releases-local' 存储库。

DSL 的新增内容是plugins部分,它(不出所料)用于声明 Grails 插件。它的语法与dependencies部分完全相同。因此,'db-util' 在plugins下声明,而 'commons-digester' 在dependencies.

下声明。您只需做这些。如果您现在执行grails run-app,您将看到如下输出:

...
Resolving dependencies...
Downloading: https://:8081/artifactory/libs-releases-local/commons-digester/commons-digester/2.0/commons-digester-2.0.pom ...
Download complete.
Downloading: https://: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: https://:8081/artifactory/plugins-releases-local/org/grails/plugins/db-util/0.4/db-util-0.4.pom ...
Download complete.
Downloading: https://:8081/artifactory/plugins-releases-local/org/grails/plugins/db-util/0.4/db-util-0.4.pom.sha1 ...
Download complete.
Downloading: https://:8081/artifactory/plugins-releases-local/org/grails/plugins/db-util/0.4/db-util-0.4.zip ...
Download complete.
Downloading: https://: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 已包含在类路径中。很简单。

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

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

将插件发布到 Maven 兼容的存储库

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

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

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

然后运行 grails maven-deploy --repository=pluginSnapshots。瞧!您的插件将使用 groupIdorg.grails.plugins部署到本地 Artifactory 'plugins-snapshots-local' 存储库。请注意,您为--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 社区所有即将举行的活动。

查看所有