2018年12月11日 星期二

Gradle dependency management

大綱:
緣起
介紹 dependency management
介紹 gradle 與 ant maven 的差別
如何安裝 gradle (如何在 eclipse 安裝 gradle)
簡易介紹 gradle 怎麼使用
附上已經建好的 build.gradle, settings.gradle
說明因為現有的專案架構,還是得需要手動搬檔的部分 (不然可以直接打包成 ear 檔,ear 黨可以讓佈署變得更輕鬆,但 tomcat 基本上不是一個 J2EE server, 所以無法)

後續待完成:
Repository server (nexus)
把 xxxx-util 整個真正的轉換成都寫在 build.gradle 的設定
Write a task for copy xxxx-util ‘s lib to local tomcat server lib folder.

----------------正文開始處---------------
緣起:
為了減少每次新建開發環境的時候,總是要手動針對每個 project  設定 lib 的 build path,除了設定繁瑣外,每次若有需要測試其他版本的 lib 時還需要去下載 lib 且手動丟到相關位置,測完了之後可能會忘記改回原本的版本。如果能使用設定檔除了能夠好維護之外,使用設定讓其自動下載需要的 lib ,還可以將設定使用 SVN 等版控控管,每次版本同步的時候就會知道是否有人使用了新的 lib。

之所以選擇使用 gradle 的原因是因為它可以跟 Ant 有比較好的相容性。可直接套用在現有的專案結構目錄,只要把 gradle 的設定檔放進去專案根目錄之後,再將現有的舊目錄結構設定進去即可。而如果是使用 Maven 的話,雖然 xml 的設定型式好像比較有結構且可以使用 UI 工具清楚管理 lib 的來源,但好像跟 Ant 不太相容,而且用 Maven 的話一定要照它的 convention,可能無法讓現有專案保持原本的結構,而且現在很多的開發也都漸漸趨向使用 gradle 了 (ex. Android Studio ) 所以決定使用 gradle 來試。

如何安裝 gradle:
  1. 到 eclipse marketplace 下載 gradle buildship plugin,或是要手動從 gradle 官網上面下載下來安裝也可以,但沒裝在 eclipse 的話就是要去 cmd 下命令執行,比較麻煩但能夠確保執行方式不會受到萬一 plugin 有 bug 的影響,建議兩邊都可以同時使用看看。build-ship-plugin.png
  2. 直接在原有專案的根目錄下加上 build.gradle, settings.gradle 這兩支檔案,settings.gradle 有時候可以不用加,加不加的原因是要看這個 project 有沒有需要用到 sub project, 如果有才需要加。
  3. 加好了後再對專案按右鍵 : Configure/Add Gradle Nature (只有第一次加設定的時候需要做這步)
  4. 之後每次有更新 build.gradle 之後需要再按右鍵 Gradle/Refresh Gradle Project 讓 eclipse 更新相對應的 project
  5. 替每個專案設定 lib 的相依性,第一步要先指定 lib 的來源 repository, 通常會使用公用的 maven repository 及要給 gradle 使用的 plugin。第二步要在 build.gradle 的 dependency scope 裡面設定相依 lib 的使用時機 (compile, compileOnly, testCompile …)
    build.gradle 範例:
apply plugin: 'java' // 告訴 eclipse 這個 project 是要用 java (JVM) 來做編譯
apply plugin: 'war' // 若此 Project 是 web project 且最後需要被打包成 war 時要用這個 plugin
apply plugin: 'eclipse-wtp' // 表示相關的設定會一併更新到 eclipse 的 wtp 工具(面板)裡,就是在這邊寫好設定之後,打開 eclipse 的 porject properties 一樣可以看到對應的設定,但從 UI 畫面手動設定的就不會更新到 build.gradle 這個設定裡了,所以最好統一在同一處設定才不會造成混淆

repositories {
  mavenCentral()
}

dependencies {
  // testCompile 表示只有在跑 test case phase 的時候會使用到這個 lib
  testCompile 'junit:junit:4.12'
  
  // compile 表示打包這個專案時,會把下面這個 lib 也打包進去
  compile 'org.apache.commons:commons-lang3:3.1'
  
  // compileOnly 表示只有在 eclipse 開發時會使用到這個 lib, 打包的時候不會打包進來現在的 project,而 compileOnly 通常也意指此 lib 在 runtime 的時候會由 server 或是其他來源提供

   // 下面這些是說此專案需要引用其他 project 的東西,需要搭配 settings.gradle 的來使用
   compileOnly project(':xxxx-util')
   compileOnly project(':xxl-util')
   compileOnly project(':xxl-xxcs-commons')
}

  1. 因為會有一個 project 引用另外一個 project 開發的東西,所以要引用其他專案的時候要另外增加一支 settings.gradle:
/*
// To declare projects as part of a multi-project build use the 'include' method
include 'shared'
include 'api'
include 'services:webservice'
*/
// 此以 xxl- project 為例,宣告會使用到下列其他專案
include 'xxxx-util'
include 'xxl-xxcs-commons'
include 'xxl-util'

project(':xxl-xxcs-commons').projectDir = new File(settingsDir, '../xxl-xxcs-commons')
project(':xxxx-util').projectDir = new File(settingsDir, '../xxxx-util')
project(':xxl-util').projectDir = new File(settingsDir, '../xxl-util')


rootProject.name = 'xxl-'
  1. 因為現有的專案架構設計成需要把 lib 丟到 tomcat lib 的原因,這些人為的設定在 build system 的 plug-in 似乎不在可以控制的範圍 QQ

沒有留言: