第19章 The Gradle Daemon 守護(hù)進(jìn)程

2018-02-24 15:56 更新

19.1. Enter the daemon 走進(jìn)守護(hù)進(jìn)程

Gradle 守護(hù)進(jìn)程(有時也稱為構(gòu)建守護(hù)進(jìn)程) 的目的是改善 Gradle 的啟動和執(zhí)行時間。

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

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

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

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

  • 在 IDE 中的內(nèi)容幫助
  • 在 GUI 中的實時可視化構(gòu)建
  • 在 CLI 中的 tab 鍵完成

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

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

未來,該守護(hù)進(jìn)程還會提供更多的功能:

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

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

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

以下是我們 fork 一個新的守護(hù)進(jìn)程的所有情況:

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

我們計劃在將來改進(jìn)守護(hù)進(jìn)程的managing / pooling的方法。

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

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

以下是有關(guān) Gradle 守護(hù)進(jìn)程的故障排除的一些方面:

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

19.4. Configuring the daemon 配置守護(hù)進(jìn)程

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

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號