第19章 The Gradle Daemon 守護進程

2018-02-24 15:56 更新

19.1. Enter the daemon 走進守護進程

Gradle 守護進程(有時也稱為構建守護進程) 的目的是改善 Gradle 的啟動和執(zhí)行時間。

我們準備了幾個守護進程非常有用的用例。對于一些工作流,用戶會多次調用 Gradle,以執(zhí)行少量的相對快速的任務。舉個例子:

  • 當使用測試驅動開發(fā)時,單元測試會被執(zhí)行多次。
  • 當開發(fā)一個 web 應用程序中,應用程序會被組裝多次。
  • 當發(fā)現(xiàn)構建能做什么,在 gradle tasks 在哪里會執(zhí)行多次。

對以上各種工作流來說,讓調用 Gradle 的啟動成本盡可能小會很重要。

此外,如果可以相對較快地建立 Gradle 模型,用戶界面可以提供一些有趣的功能。例如,該守護進程可能用于以下情形:

  • 在 IDE 中的內容幫助
  • 在 GUI 中的實時可視化構建
  • 在 CLI 中的 tab 鍵完成

一般情況下,構建工具的敏捷行為總是可以派上用場。如果你嘗試在你的本地構建中使用守護進程的話,它會變得讓你很難回到正常的 Gradle 使用。

Tooling API (參見?Chapter 63. Embedding Gradle 嵌入 Gradle) 在整個過程當中都使用守護進程。如,你無法在沒有守護進程時正式地使用 Tooling API。這意味著當您在 Eclipse中使用 STS Gradle 或在 Intellij IDEA 中使用 Gradle 支持時,您已經(jīng)在使用 Gradle 守護進程。

未來,該守護進程還會提供更多的功能:

  • 敏捷的 up-to-date 檢查:使用本地文件系統(tǒng)修改通知(例如,通過 jdk7 nio.2)預先執(zhí)行 up-to-date 分析。
  • 更快的構建: 預評估項目,這樣當用戶接下來調用 Gradle 時,模型就準備好了。
  • 我們提到了更快的構建嗎?守護進程可以預先下載依賴項或進行快照依賴的新版本檢查。
  • 使用可用于編譯和測試的一個可復用線程池。例如,Groovy 和 Scala 的編譯器啟動開銷都很大。構建守護進程可以維持一個已下載的 Groovy 和 (或) Scala 進程。
  • 預先執(zhí)行某些任務,比如編譯。更快的反饋。
  • 快速、 準確的 bash 的 tab 鍵完成。
  • Gradle 緩存的定期垃圾收集。

19.2. Reusing and expiration of daemons 重用和失效的守護程序

基本的思想是, gradle 命令會 fork 一個守護進程,用于執(zhí)行實際的構建。Gradle 命令的后續(xù)調用將重用該守護進程,以避免啟動開銷。有時我們不能使用現(xiàn)有的守護進程,是因為它正忙或其 java 版本或 jvm 參數(shù)不同。關于fork一個完全新的守護進程的具體細節(jié),請閱讀下面的專題。守護進程將在空閑3小時后自動失效。

以下是我們 fork 一個新的守護進程的所有情況:

  • 如果該守護進程當前正忙于運行一些作業(yè),將啟動一個全新的守護進程。 對每個java home,我們會fork一個單獨的守護進程。所以即使有一些閑置的守護進程等待構建請求,但你碰巧通過不同的 java HOME 運行構建,那么一個全新的守護進程將會被 fork。
  • 如果用于構建的 jvm 的參數(shù)足夠不同,我們會 fork 一個單獨的守護進程。例如,如果某些系統(tǒng)屬性已經(jīng)更改,我們不會 fork 一個新的守護進程。然而,如果 -Xmx 內存設置更改了,或一些基本的不變的系統(tǒng)屬性更改了 (例如 file.encoding),那么將 fork 新的守護進程。
  • 在這一刻,守護進程會被加上 Gradle 的特定版本號。這意味著即使一些守護進程處于空閑狀態(tài),但您正在運行的構建與 Gradle 不同版本,也將啟動一個新的守護進程。這也有一種 --stop 命令行指令的結果: 當運行 --stop 時,您僅可以停止以你的 Gradle 版本啟動的守護進程。

我們計劃在將來改進守護進程的managing / pooling的方法。

19.3. Usage and troubleshooting 用法和故障排除

關于命令行的用法,可以看一下專題Appendix D. Gradle Command Line 命令行。如果你已經(jīng)厭倦反復使用相同的命令行選項,可以看看第 20.1 章節(jié),“通過 gradle.properties 配置構建環(huán)境”。這一章節(jié)包含了有關如何以一種“持久化”的方式配置某些行為(包括在默認情況下打開守護進程)的信息。

以下是有關 Gradle 守護進程的故障排除的一些方面:

  • 如果你的構建有問題,請嘗試暫時禁用守護進程 (您可以通過使用命令行開關--no-daemon)。
  • 有時候,您可能想要通過--stop命令行選項或更有力的方式停止守護程序。
  • 默認情況下位于 Gradle 用戶主目錄有一個守護進程的日志文件。
  • 你可能想要以--foreground模式啟動守護程序,以觀察構建是怎么執(zhí)行的。

19.4. Configuring the daemon 配置守護進程

可以配置一些守護進程的設置,例如 JVM 參數(shù)、 內存設置或Java home目錄。有關更多信息請參閱20.1章節(jié), “通過 gradle.properties 配置構建環(huán)境”

以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號