當前位置:
首頁 > 最新 > Gradle Kotlin DSL的accessors 生成問題

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 的優點,靜態類型安全有保障。。


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Kotlin 的精彩文章:

TAG:Kotlin |