使用 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 "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"
    }
}

因此,在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://: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 包已包含在 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: "https://: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 社群所有即將舉行的活動。

檢視全部