Gradle Kotlin DSL的accessors 生成問題
概要
如果你想用 gradle kotlin DSL,那麼請注意,accessors 的支持從 0.8.0 開始(gradle 3.5),後續也做了一些完善和更新,目前已經默認開啟了這一項功能。使用時由於 accessors 是動態生成的,因此要注意使用 可以直接觸發 accessors 的動態生成,其他情況下就比較麻煩了。
正文
昨天也是手欠,非要用 Gradle Kotlin DSL 構建工程,還看到現在連 settings.gradle 也支持用 kts 了,於是乎:
不過這個需要 Gradle 的版本在 4.4 以上,gradle-wrapper.properties 的版本修改為:
然而一運行,出事兒了,compile 不識別。。
額,這就尷尬了,哪兒說理去。。由於 Kotlin 是靜態語言,能夠在這個地方寫出來 compile 那麼一定是定義了這個方法,就像:
這裡的 classpath 就是一個方法:
那麼 compile 的定義哪兒去了?其實,compile 和 classpath 不一樣,前者是構建插件的 configuration,而 classpath 則是 gradle 本身的一個方法。
那麼 compile 到底是什麼,gradle 自己沒有定義就不能用了嗎?那倒也不是,gradle kotlin DSL 會幫我們根據插件的 configuration 定義生成這樣的代碼。這在 gradle kotlin dsl 0.8.0 中就做了支持,官方把他們稱作:Type-safe accessors,這個版本也跟隨 gradle 3.5 發版。
後來查了一下官方 demo "hello-kotlin":
對比了一下才發現,原來人家用的 是 這種寫法,而我的工程仍然用的是 的寫法,就這麼點兒區別。。難道真的是因為這個?
果然,我把我的配置修改了一下:
這時候果然沒問題了:
而且我們也能找到 compile 的定義:
原來,這些 gradle 幫我們動態生成的 accessors,生成的時機就是 調用之後。也就是說我們需要使用這種方式來應用插件才會生成上述的方法。
詳細說明在 gradle kotlin DSL 0.8.0 的更新說明當中:https://github.com/gradle/kotlin-dsl/releases/tag/v0.8.0 ,不過其中提到的 gskGenerateAccessors 我在 gradle 4.5 當中已經找不到了。
小結
kotlin 和 groovy 也算是各有所長,如果我們對於 gradle 的語法非常熟悉,那麼我個人認為用 groovy 寫 DSL 倒也靈活,kotlin 的約束畢竟多一些——而這也正是 Kotlin DSL 的優點,靜態類型安全有保障。。
TAG:Kotlin |