Gradle 筆記

via: https://tianyu94.com/2019/06/...
  • Make the impossible possible, make the possible easy, and make the easy elegant
  • Gradle is Groovy
  • Minimize Coupling, Maximize Cohesion

Task 任務

task helloWorld {
  doLast {
    println 'Hello world~'
  }
}
$ gradle -q helloWorld
Hello world~
-q quiet 只輸出 task 的相關信息
  • 每一個新建的 task 默認都是 DefaultTask 類,標準的 Task 實現。

結合函數方法

task startTask {
  doLast {
    hello()
  }
}

def hello() {
  println 'Hello~'
}
$ gradle startTask
Hello~

動態 task

3.times {
  task 'repeatTask$it' {
    println 'I am repeat task'
  }
}

// 指定此 task 需依賴 repeatTask0
task groupTherapy(dependsOn: repeatTask0)
$ gradle groupTherapy
:repeatTask0
I am repeat task
:repeatTask1
I am repeat task
:repeatTask2
I am repeat task
$ gradle groupTherapy -x repeatTask1
:repeatTask0
I am repeat task
:repeatTask2
I am repeat task
-x 排除指定 task
$ gradle repeatTask0 groupTherapy
:repeatTask0
I am repeat task
:repeatTask1
I am repeat task
:repeatTask2
I am repeat task
執行多個 task,且每一個 task 僅執行一次

給現有的 task 添加動做

task printVersion {
  doFirst {
    println 'Version 0.1 in doFirst'
  }

  doLast {
    println 'Version 0.1 in doLast'
  }
}

printVersion.doFirst { println 'First action' }
printVersion.doLast {  println 'Last action' }
$ gradle printVersion
First action
Version 0.1 in doFirst
Version 0.1 in doLast
Last action

設置描述和分組

task myTask {
  group = 'group1'
  description = 'I am myTask of group1'
}
// or
task myTask(group: 'group1',
            description: 'I am myTask of group1') {
  // ...
}

依賴多個 task

task myTask(dependsOn: [otherTask1, otherTask2]) {
  // ...
}
注意,若執行 myTask,它依賴的 otherTask1 和 otherTask2 (除其自己有依賴關係外)並不會保證執行的前後順序與代碼順序一致。這個特徵可以使多個 task 並行執行提升效率,或是忽略固定的順序來保證代碼的維護性和避免潛在的破壞

終結器 task (finalizer task)

task task1 {
  doLast { println 'task1' }
}

task task2 {
  doLast { println 'task2' }
}

task1.finalizedBy task2
$ gradle task1
task1
task2
若終結器 task 執行失敗,則不會影響 Gradle 的 task 的執行進度

部分命令行選項

  • -? / -h / --help 打印幫助信息
  • -b / --build-file 指定構建文件 e.g. gradle -b my.gradle
  • --offline 使用緩存離線構建
  • -q / --quiet, -w / --warning, -i / --info, -d / --debug 日誌等級
  • s / --stacktrace 打印簡要堆棧跟蹤
  • S / --full-stacktrace 打印全部堆棧跟蹤

幫助 task

  • tasks 顯示項目可運行的 task,-a / --all 顯示所有 task
  • properties 顯示項目中可用屬性

插件

使用 Java 插件

apply plugin: 'java'

使用 War 插件

apply plugin: 'war'

// 部分自定義屬性設置
webAppDirName = 'mywebfiles' // 指定Web應用的源代碼路徑
war {
  // 將 mydir1,mydir2 路徑添加到 war 文件的根目錄下
  from 'mydir1'
  from 'mydir2'
}

使用 Jetty 插件

// 在 Gradle 4.0 以前可用
apply plugin: 'jetty'

// 在 Gradle 4.0 以後 jetty 插件已移除,替換爲 Gretty
// 其餘引用方法見官網:https://gretty-gradle-plugin.github.io/gretty-doc/Getting-started.html
apply from: 'https://raw.github.com/akhikhl/gretty/master/pluginScripts/gretty.plugin'

// Gretty 屬性設置
// 詳情見官網:https://gretty-gradle-plugin.github.io/gretty-doc/Gretty-configuration.html
gretty {
  httpPort = 8081 // 指定服務端口
  contextPath = '/MyWebApp' // 指定 url 根路徑
  // ... many more properties
}

Gretty tasks

  • appRun / jettyRun 運行程序

屬性

version = 0.1 // 設置項目版本
sourceCompatibility = 1.8 // 設置Java編譯兼容版本爲 1.8

jar {
  manifest {
    // 添加屬性到 Jar 文件中
    attributes 'Main-Class': 'path.to.your.MainClass'
  }
}

sourceSets {
  main {
    java {
      // 自定義源代碼路徑,默認是 /src/main/java/
      srcDirs = ['your_src_dir_path']
    }
  }
  test {
    java {
      // 自定義測試代碼路徑,默認是 /src/test/java
      srcDirs = ['your_test_dir_path']
    }
  }
}

拓展屬性

project.ext.myProp = 'hello'
// or
ext.myProp = 'hello'
// or
myProp = 'hello'

或者在 gradle.properties 文件中定義拓展屬性html

依賴

repositories {
    mavenCentral() // 使用 Maven Central 2 倉庫
}

// 如下依賴存在多個重複,僅作示例
dependencies {
  // 編譯使用
  compile group: 'org.apache.commons', name: 'commons-lang3', version: '3.9'
  // 簡寫形式,用冒號隔開
  compile 'org.apache.commons:commons-lang3:3.9'

  // 同 compile ,在 Gradle 5.x 後(建議)用此替換 compile
  implementation 'org.apache.commons:commons-lang3:3.9'

  // 編譯時須要,在運行時由環境提供
  providedCompile 'javax.servlet:servlet-api:2.5'

  // 運行時提供
  runtime 'javax.servlet:jstl:1.1.2'
}

包裝器

生成包裝器

$ gradle wrapper
# 在構建腳本 build.gradle 旁會生成 gradle/wrapper/... 的包裝器文件 *.jar 和 *.properties
# 同時生成 gradlew(for linux),gradlew.bat(for windows)

使用包裝器

  • Windows: gradlew.bat ...
  • Linux: gradlew ...

定製包裝器

task wrapper(type: Wrapper) {
  // 指定 Gradle 版本
  gradleVersion = '5.1.1'
  // 獲取 Gradle 包的 url
  distributionUrl = 'http://mycustomserver.com/gradle/dists'
  // 包裝器被解壓後存放的相對路徑
  distributionPath = 'gradle-dists'
}
筆記部份內容來源:Gradle in Action https://www.manning.com/books...
相關文章
相關標籤/搜索