使用 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 社群所有即將舉行的活動。

檢視所有