(四)Kotlin 領域特定語言 DSL

溫馨提示

寫博客是為了記錄在開發(fā)過程中所涉及到的技術以及遇到的問題的解決,如果該博客對您有所幫助恋谭,希望可以點個關注/喜歡糠睡;如果您對文章中的內(nèi)容有什么不同的見解,歡迎留言進行討論疚颊。謝謝狈孔!

一、領域特定語言 DSL的概念

  • 只在特定領域使用的語言;例如:HTML材义、Gradle均抽、SQL

二、領域特定語言 DSL的特點

  • 它也是計算機編程語言
  • 具有語言表達能力
  • 表達能力比較有限
  • 關注某個特定領域

三其掂、Html DSL

四油挥、Gradle DSL

以下內(nèi)容引用自 Kotlin 語言中文站

使用 Gradle

為了用 Gradle 構(gòu)建 Kotlin,你應該設置好 kotlin-gradle 插件款熬,將其應用到你的項目中深寥,并且添加 kotlin-stdlib 依賴。這些操作也可以在 IntelliJ IDEA 中通過調(diào)用 Project action 中的 Tools | Kotlin | Configure Kotlin 自動執(zhí)行贤牛。

插件和版本

使用 kotlin-gradle-plugin 編譯 Kotlin 源代碼和模塊.

要使用的 Kotlin 版本通常定義為 kotlin_version 屬性:

buildscript {
    ext.kotlin_version = '1.3.11'

    repositories {
        mavenCentral()
    }

    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

當通過 Gradle 插件 DSLGradle Kotlin DSL 使用 Kotlin Gradle 插件 1.1.1 及以上版本時惋鹅,這不是必需的。

針對 JVM

針對 JVM殉簸,需要應用 Kotlin 插件:

apply plugin: "kotlin"

或者闰集,從 Kotlin 1.1.1 起,可以使用 Gradle 插件 DSL 來應用該插件:

plugins {
    id "org.jetbrains.kotlin.jvm" version "1.3.11"
}

在這個塊中的 version 必須是字面值般卑,并且不能從其他構(gòu)建腳本中應用武鲁。
對于 Gradle Kotlin DSL,請按以下方式應用插件:

plugins {
    kotlin("jvm") version "1.3.11"
}

Kotlin 源代碼可以與同一個文件夾或不同文件夾中的 Java 源代碼混用蝠检。默認約定是使用不同的文件夾:

project
    - src
        - main (root)
            - kotlin
            - java

如果不使用默認約定沐鼠,那么應該更新相應的 sourceSets 屬性:

sourceSets {
    main.kotlin.srcDirs += 'src/main/myKotlin'
    main.java.srcDirs += 'src/main/myJava'
}

對于 Gradle Kotlin DSL,請改用 java.sourceSets { …… } 配置源集叹谁。

針對 JavaScript

當針對 JavaScript 時迟杂,須應用不同的插件:

apply plugin: "kotlin2js"

這個插件只適用于 Kotlin 文件,因此建議將 Kotlin 和 Java 文件分開(如果是同一項目包含 Java 文件的情況)本慕。與針對 JVM 一樣,如果不使用默認約定侧漓,我們需要使用 sourceSets 來指定源代碼文件夾:

sourceSets {
    main.kotlin.srcDirs += 'src/main/myKotlin'
}

除了輸出的 JavaScript 文件锅尘,該插件默認會創(chuàng)建一個帶二進制描述符的額外 JS 文件。 如果你是構(gòu)建其他 Kotlin 模塊可以依賴的可重用庫,那么該文件是必需的藤违,并且應該與轉(zhuǎn)換結(jié)果一起分發(fā)浪腐。 其生成由 kotlinOptions.metaInfo 選項控制:

compileKotlin2Js {
    kotlinOptions.metaInfo = true
}

針對 Android

Android 的 Gradle 模型與普通 Gradle 有點不同,所以如果我們要構(gòu)建一個用 Kotlin 編寫的 Android 項目顿乒,我們需要用 kotlin-android 插件取代 kotlin 插件:

buildscript {
    ext.kotlin_version = '1.3.11'

    ……

    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'

不要忘記配置標準庫依賴關系议街。

Android Studio

如果使用 Android Studio,那么需要在 android 下添加以下內(nèi)容:

android {
  ……

  sourceSets {
    main.java.srcDirs += 'src/main/kotlin'
  }
}

這讓 Android Studio 知道該 kotlin 目錄是源代碼根目錄璧榄,所以當項目模型加載到 IDE 中時特漩,它會被正確識別」窃樱或者涂身,你可以將 Kotlin 類放在 Java 源代碼目錄中,該目錄通常位于 src/main/java搓蚪。

配置依賴

除了上面顯示的 kotlin-gradle-plugin 依賴之外蛤售,還需要添加 Kotlin 標準庫的依賴:

repositories {
    mavenCentral()
}

dependencies {
    compile "org.jetbrains.kotlin:kotlin-stdlib"
}

如果針對 JavaScript,請使用 compile "org.jetbrains.kotlin:kotlin-stdlib-js" 替代之妒潭。

如果是針對 JDK 7 或 JDK 8悴能,那么可以使用擴展版本的 Kotlin 標準庫,其中包含為新版 JDK 增加的額外的擴展函數(shù)雳灾。使用以下依賴之一來取代 kotlin-stdlib

compile "org.jetbrains.kotlin:kotlin-stdlib-jdk7"
compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8"

對于 Gradle Kotlin DSL漠酿,以下表示法的依賴關系與其等價:

dependencies {
    compile(kotlin("stdlib"))
    // 或者以下之一:
    compile(kotlin("stdlib-jdk7"))
    compile(kotlin("stdlib-jdk8"))
}

在 Kotlin 1.1.x 中,請使用 kotlin-stdlib-jre7kotlin-stdlib-jre8佑女。

如果你的項目中使用 Kotlin 反射或者測試設施记靡,你也需要添加相應的依賴:

compile "org.jetbrains.kotlin:kotlin-reflect"
testCompile "org.jetbrains.kotlin:kotlin-test"
testCompile "org.jetbrains.kotlin:kotlin-test-junit"

或者,對于 Gradle Kotlin DSL:

compile(kotlin("reflect"))
testCompile(kotlin("test"))
testCompile(kotlin("test-junit"))

從 Kotlin 1.1.2 起团驱,使用 org.jetbrains.kotlin group 的依賴項默認使用從已應用的插件獲得的版本來解析摸吠。你可以用完整的依賴關系符號 (如 compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version",或者在 Gradle Kotlin DSL 中用 kotlin("stdlib", kotlinVersion))手動提供其版本嚎花。

注解處理

請參見 Kotlin 注解處理工具kapt)的描述寸痢。

增量編譯

Kotlin 支持 Gradle 中可選的增量編譯。 增量編譯跟蹤構(gòu)建之間源文件的改動紊选,因此只有受這些改動影響的文件才會被編譯啼止。

從 Kotlin 1.1.1 起,默認啟用增量編譯兵罢。

有幾種方法來覆蓋默認設置:

  1. kotlin.incremental=true 或者 kotlin.incremental=false 行添加到一個 gradle.properties 或者一個 local.properties 文件中献烦;

  2. -Pkotlin.incremental=true-Pkotlin.incremental=false 添加到 Gradle 命令行參數(shù)。請注意卖词,這樣用法中巩那,該參數(shù)必須添加到后續(xù)每個子構(gòu)建,并且任何具有禁用增量編譯的構(gòu)建將使增量緩存失效。

請注意即横,第一次構(gòu)建不會是增量的噪生。

Coroutines support

Coroutines support is an experimental feature in Kotlin 1.2, so the Kotlin compiler reports a warning when you use coroutines in your project. To turn off the warning, add the following block to your build.gradle file:

kotlin {
    experimental {
        coroutines 'enable'
    }
}

Or, with Gradle Kotlin DSL:

import org.jetbrains.kotlin.gradle.dsl.Coroutines
// ...

kotlin.experimental.coroutines = Coroutines.ENABLE

Module names

The Kotlin modules that the build produces are named accordingly to the archivesBaseName property of the project. If a project has a broad name like lib or jvm, which is common for subprojects, the Kotlin output files related to the module (*.kotlin_module) might clash with those from third-party modules with the same name. This causes problems when a project is packaged into a single archive (e.g. APK).

To avoid this, consider setting a unique archivesBaseName manually:

archivesBaseName = 'myExampleProject_lib'

With Gradle Kotlin DSL, it is:

setProperty("archivesBaseName", "myExampleProject_lib")

Gradle 構(gòu)建緩存支持(自 1.2.20 起)

Kotlin 插件支持 Gradle 構(gòu)建緩存(需要 Gradle 4.3 及以上版本;低版本則禁用緩存)东囚。

由于注解處理器運行的任意代碼可能不一定會將任務輸入轉(zhuǎn)換為輸出跺嗽、可能訪問與修改 Gradle 未跟蹤的文件等,因此默認不緩存 kapt 注解處理任務页藻。要啟用 kapt 緩存桨嫁,請將以下列幾行添加到構(gòu)建腳本中:

kapt {
    useBuildCache = true
}

要禁用所有 Kotlin 任務的緩存,請將系統(tǒng)屬性標志 kotlin.caching.enabled 設置為 false(運行構(gòu)建帶上參數(shù) -Dkotlin.caching.enabled=false)惕橙。

編譯器選項

要指定附加的編譯選項瞧甩,請使用 Kotlin 編譯任務的 kotlinOptions 屬性。

當針對 JVM 時弥鹦,對于生產(chǎn)代碼這些任務稱為 compileKotlin 而對于測試代碼稱為 compileTestKotlin肚逸。對于自定義源文件集(source set)這些任務稱呼取決于 compile<Name>Kotlin 模式。

Android 項目中的任務名稱包含構(gòu)建變體 名稱彬坏,并遵循 compile<BuildVariant>Kotlin 的模式朦促,例如 compileDebugKotlincompileReleaseUnitTestKotlin栓始。

當針對 JavaScript 時务冕,這些任務分別稱為 compileKotlin2JscompileTestKotlin2Js,以及對于自定義源文件集稱為 compile<Name>Kotlin2Js幻赚。

要配置單個任務禀忆,請使用其名稱。示例:

compileKotlin {
    kotlinOptions.suppressWarnings = true
}

compileKotlin {
    kotlinOptions {
        suppressWarnings = true
    }
}

對于 Gradle Kotlin DSL落恼,首先從項目的 tasks 中獲取任務:

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
// ……

val compileKotlin: KotlinCompile by tasks

compileKotlin.kotlinOptions.suppressWarnings = true

相應地箩退,為 JS 與 Common 目標使用類型 Kotlin2JsCompileKotlinCompileCommon

也可以在項目中配置所有 Kotlin 編譯任務:

tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile::class.java).all {
    kotlinOptions { …… }
}

對于 Gradle 任務的完整選項列表如下:

JVM佳谦、JS 與 JS DCE 的公共屬性
名稱 描述 可能的值 默認值
allWarningsAsErrors 任何警告都報告為錯誤 false
suppressWarnings 不生成警告 false
verbose 啟用詳細日志輸出 false
freeCompilerArgs 附加編譯器參數(shù)的列表 []
JVM 與 JS 的公共屬性
Name Description Possible values Default value
apiVersion 只允許使用來自捆綁庫的指定版本中的聲明 "1.0"戴涝、 "1.1"、 "1.2"钻蔑、 "1.3"啥刻、 "1.4 (EXPERIMENTAL)"
languageVersion 提供與指定語言版本源代碼兼容性 "1.0"、 "1.1"咪笑、 "1.2"可帽、 "1.3"、 "1.4 (EXPERIMENTAL)"
JVM 特有的屬性
名稱 描述 可能的值 默認值
javaParameters 為方法參數(shù)生成 Java 1.8 反射的元數(shù)據(jù) false
jdkHome 要包含到 classpath 中的 JDK 主目錄路徑窗怒,如果與默認 JAVA_HOME 不同的話
jvmTarget 生成的 JVM 字節(jié)碼的目標版本(1.6 或 1.8)映跟,默認為 1.6 "1.6"钝满、 "1.8" "1.6"
noJdk 不要在 classpath 中包含 Java 運行時 false
noReflect 不要在 classpath 中包含 Kotlin 反射實現(xiàn) true
noStdlib 不要在 classpath 中包含 Kotlin 運行時 true
JS 特有的屬性
名稱 描述 可能的值 默認值
friendModulesDisabled 禁用內(nèi)部聲明導出 false
main 是否要調(diào)用 main 函數(shù) "call"、 "noCall" "call"
metaInfo 使用元數(shù)據(jù)生成 .meta.js 與 .kjsm 文件申窘。用于創(chuàng)建庫 true
moduleKind 編譯器生成的模塊類型 "plain"、 "amd"孔轴、 "commonjs"剃法、 "umd" "plain"
noStdlib 不使用捆綁的 Kotlin stdlib true
outputFile 輸出文件路徑
sourceMap 生成源代碼映射(source map) false
sourceMapEmbedSources 將源代碼嵌入到源代碼映射中 "never"、 "always"路鹰、 "inlining"
sourceMapPrefix 源代碼映射中路徑的前綴
target 生成指定 ECMA 版本的 JS 文件 "v5" "v5"
typedArrays 將原生數(shù)組轉(zhuǎn)換為 JS 帶類型數(shù)組 true
生成文檔

要生成 Kotlin 項目的文檔贷洲,請使用 Dokka; 相關配置說明請參見 Dokka README 晋柱。Dokka 支持混合語言項目优构,并且可以生成多種格式的輸出 ,包括標準 JavaDoc雁竞。

OSGi

關于 OSGi 支持請參見 Kotlin OSGi 頁钦椭。

使用 Gradle Kotlin DSL

使用 Gradle Kotlin DSL 時,請使用 plugins { …… } 塊應用 Kotlin 插件碑诉。如果使用 apply { plugin(……) } 來應用的話彪腔,可能會遇到未解析的到由 Gradle Kotlin DSL 所生成擴展的引用問題。為了解決這個問題进栽,可以注釋掉出錯的用法德挣,運行 Gradle 任務 kotlinDslAccessorsSnapshot,然后解除該用法注釋并重新運行構(gòu)建或者重新將項目導入到 IDE 中快毛。

上一篇:(三)Kotlin 高階函數(shù)

下一篇:(五)協(xié)程 Coroutine

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末格嗅,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子唠帝,更是在濱河造成了極大的恐慌屯掖,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件没隘,死亡現(xiàn)場離奇詭異懂扼,居然都是意外死亡,警方通過查閱死者的電腦和手機右蒲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門阀湿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人瑰妄,你說我怎么就攤上這事陷嘴。” “怎么了间坐?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵灾挨,是天一觀的道長邑退。 經(jīng)常有香客問我,道長劳澄,這世上最難降的妖魔是什么地技? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮秒拔,結(jié)果婚禮上莫矗,老公的妹妹穿的比我還像新娘。我一直安慰自己砂缩,他們只是感情好作谚,可當我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著庵芭,像睡著了一般妹懒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上双吆,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天眨唬,我揣著相機與錄音,去河邊找鬼伊诵。 笑死单绑,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的曹宴。 我是一名探鬼主播搂橙,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼笛坦!你這毒婦竟也來了区转?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤版扩,失蹤者是張志新(化名)和其女友劉穎废离,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體礁芦,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡蜻韭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了柿扣。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肖方。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖未状,靈堂內(nèi)的尸體忽然破棺而出俯画,到底是詐尸還是另有隱情,我是刑警寧澤司草,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布艰垂,位于F島的核電站泡仗,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏猜憎。R本人自食惡果不足惜娩怎,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望胰柑。 院中可真熱鬧峦树,春花似錦、人聲如沸旦事。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽姐浮。三九已至,卻和暖如春葬馋,著一層夾襖步出監(jiān)牢的瞬間卖鲤,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工畴嘶, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蛋逾,地道東北人。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓窗悯,卻偏偏與公主長得像区匣,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子蒋院,可洞房花燭夜當晚...
    茶點故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容