溫馨提示
寫博客是為了記錄在開發(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 插件 DSL 與 Gradle 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-jre7
與 kotlin-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 起,默認啟用增量編譯兵罢。
有幾種方法來覆蓋默認設置:
將
kotlin.incremental=true
或者kotlin.incremental=false
行添加到一個gradle.properties
或者一個local.properties
文件中献烦;將
-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
的模式朦促,例如 compileDebugKotlin
、 compileReleaseUnitTestKotlin
栓始。
當針對 JavaScript 時务冕,這些任務分別稱為 compileKotlin2Js
與 compileTestKotlin2Js
,以及對于自定義源文件集稱為 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 目標使用類型 Kotlin2JsCompile
與 KotlinCompileCommon
。
也可以在項目中配置所有 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 中快毛。