使用 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 的“部署”选项卡(已使用用户名“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://127.0.0.1:8081/artifactory/libs-releases-local/"
        mavenRepo "https://127.0.0.1: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: https://127.0.0.1:8081/artifactory/libs-releases-local/commons-digester/commons-digester/2.0/commons-digester-2.0.pom ...
Download complete.
Downloading: https://127.0.0.1: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://127.0.0.1:8081/artifactory/plugins-releases-local/org/grails/plugins/db-util/0.4/db-util-0.4.pom ...
Download complete.
Downloading: https://127.0.0.1:8081/artifactory/plugins-releases-local/org/grails/plugins/db-util/0.4/db-util-0.4.pom.sha1 ...
Download complete.
Downloading: https://127.0.0.1:8081/artifactory/plugins-releases-local/org/grails/plugins/db-util/0.4/db-util-0.4.zip ...
Download complete.
Downloading: https://127.0.0.1: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 发布者插件

grails.project.dependency.distribution = {
    remoteRepository(id: "pluginSnapshots", url: "https://127.0.0.1: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 中定义的远程存储库的“id”匹配。grails.project.dependency.distribution闭包。

您可以微调部署,例如通过使用包含<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 社区中所有即将举行的活动。

查看全部