「Kotinミニマリストチュートリアル」第12章Kotlinを使用してGradle開発を統合する

第12章Kotlinを使用したGradle開発の統合

Kotlinには、ファーストクラスの関数や拡張メソッドなどの豊富な機能があるため、簡潔な宣言構文やDSLを簡単に作成する機能など、Gradleビルドスクリプトの優れた部分を保持および改善できます。

GradleチームはKotlinチームと緊密に協力して、Gradle用の新しいKotlinスクリプトベースのビルド構成言語を開発しました。ビルドファイルと構成ファイルを書き込むためのKotlinの使用をサポートする、Gradle Script Kotlinと呼びます。同時に、IDEでの自動補完やコンパイルチェックなどの機能もサポートします。Gradle Script Kotlinを使用すると、通常のコードを書くのと同じように、Kotlinを使用して構成ファイルを書くことができます。

Kotlinプロジェクトを構築するために、前の章の多くのサンプルプロジェクトでGradleを使用しました。この章では、Kotlinを使用してGradle開発を統合する関連コンテンツを体系的に紹介します。

12.1 Gradleを使用してKotlinプロジェクトをビルドする

12.1.1 kotlin-gradleプラグイン

GradleでKotlinプロジェクトを構築するには、kotlin-gradleプラグインを設定する必要があります。

buildscript {
	ext {
		kotlinVersion = '1.1.3-2'
	}
	repositories {
		mavenCentral()
	}
	dependencies {
		classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:${kotlinVersion}")
                ...
	}
}

apply plugin: 'kotlin'

そして、kotlin-stdlib依存関係を追加します

dependencies {
	compile("org.jetbrains.kotlin:kotlin-stdlib-jre8:${kotlinVersion}")
	compile("org.jetbrains.kotlin:kotlin-reflect:${kotlinVersion}")
}

もちろん、新しいプロジェクトを作成するときのこれらの操作では、通常、対応するオプションを選択するだけでよく、IntelliJ IDEAは基本的な構成を直接支援します。

以前kotlin-gradle-pluginは、Kotlinのソースコードとモジュールをコンパイルしていました。使用されるKotlinのバージョンは通常、kotlinVersionプロパティとして定義されます。

JVMの場合、Kotlinプラグインを適用する必要があります。

apply plugin: "kotlin"

12.1.2 KotlinとJavaの混合プログラミング

Kotlinソースコードは、同じフォルダーまたは異なるフォルダーでJavaソースコードと混合できます。デフォルトの規則では、別のフォルダーを使用します。

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

デフォルトのディレクトリを使用する場合は、上記の設定を省略できます。

デフォルトの規則を使用しない場合は、対応するsourceSets属性を更新する必要があります

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

12.1.3 Gradle JavaScriptプロジェクトの構成

JavaScriptを対象とする場合、さまざまなプラグインを適用する必要があります。

apply plugin: "kotlin2js"

出力JavaScriptファイルに加えて、プラグインはデフォルトでバイナリ記述子を持つ追加のJSファイルを作成します。

他のKotlinモジュールが信頼できる再利用可能なライブラリを構築する場合は、このファイルが必要であり、変換結果とともに配布されます。

バイナリ記述子ファイルkotlinOptions.metaInfoオプションによって生成されます:

compileKotlin2Js {
    
    
	kotlinOptions.metaInfo = true
}

ヒント:サンプルプロジェクトについては、
https://github.com/EasyKotlin/chapter2_hello_world_kotlin2js を参照してください

12.1.4 Gradle Androidプロジェクトの構成

AndroidのGradleモデルは通常のGradleとは少し異なるため、Kotlinで記述されたAndroidプロジェクトをビルドする場合はkotlinプラグインkotlin-androidプラグイン置き換える必要があります。

buildscript {
    
    
    ext.kotlin_version = '1.1.2-4'
    repositories {
    
    
        jcenter()
    }
    dependencies {
    
    
        classpath 'com.android.tools.build:gradle:2.3.1'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

通常、Android Studioを使用して、アプリサブプロジェクトを含むプロジェクトを生成します。マルチプロジェクト構成の実装では、通常、すべてのプロジェクトをルートプロジェクトパスの下のサブフォルダーとして含めます。たとえば、プロジェクトのルートパスの下にあるsettings.gradleで次のように構成します。

include ':app'

各サブプロジェクトには、ビルド方法を宣言するための独自のbuild.gradleファイルがあります。

たとえば、サブプロジェクトアプリのビルド構成ファイルbuild.gradleの完全な構成は次のとおりです。

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.2"
    defaultConfig {
        applicationId "com.kotlin.easy.kotlinandroid"
        minSdkVersion 14
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:25.3.1'
    compile 'com.android.support.constraint:constraint-layout:1.0.2'
    testCompile 'junit:junit:4.12'
    compile "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
}
repositories {
    mavenCentral()
}

その中で、

apply plugin: 'kotlin-android'はKotlin Androidプラグインです。
コンパイル "org.jetbrains.kotlin:kotlin-stdlib-jre7:$ kotlin_version"はKotlinランタイム標準ライブラリです。

また、Android Studioがデフォルトでソースコードをロードするディレクトリはsrc/main/javaです。src/main/kotlnディレクトリにKotlinコードを指定する場合は、androidの下に次のコンテンツを追加できます。

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

ヒント:Kotlin Androidの完全なGradle構成例については、https://github.com/EasyKotlin/KotlinAndroidを参照してください。

12.1.5 Kotlin標準ライブラリの依存関係を構成する

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に追加された追加の拡張関数が含まれています。代わりに、次の依存関係のいずれかを使用してくださいkotlin-stdlib

compile "org.jetbrains.kotlin:kotlin-stdlib-jre7"
compile "org.jetbrains.kotlin:kotlin-stdlib-jre8"

プロジェクトでKotlinリフレクションが使用されている場合は、リフレクション依存関係を追加します。

compile "org.jetbrains.kotlin:kotlin-reflect"

プロジェクトでテストフレームワークが使用されている場合は、対応するテストライブラリの依存関係を追加します。

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

12.1.6増分コンパイル

Kotlinは、Gradleでのオプションのインクリメンタルコンパイルをサポートしています。インクリメンタルコンパイルは、ビルド間のソースファイルへの変更を追跡するため、これらの変更の影響を受けるファイルのみがコンパイルされます。Kotlin 1.1.1以降、増分コンパイルはデフォルトで有効になっています。

12.1.7コンパイラオプション

追加のコンパイラオプションを指定するには、kotlinOptionsプロパティのKotlinコンパイルタスクcompileKotlinを使用できます。

単一タスクの構成例:

compileKotlin {
    
    
    kotlinOptions {
    
    
        suppressWarnings = true
    }
}

12.2 Kotlinを使用してビルドおよび構成ファイルを書き込む

Kotlinに基づくGradleビルドスクリプトとプラグインを作成する方法はどのようなものでしょうか?チーム、特に大規模なチームが作業をスピードアップし、より構造化された、保守性の高いビルドスクリプトを作成するのにどのように役立ちますか?

これらの可能性は非常に魅力的です。

Kotlinは、静的に型付けされた言語であり、IDEAとEclipseで詳細にサポートされているため、Gradleユーザーにオートコンプリートからリファクタリングまでの適切なIDEサポートを提供できます。また、Kotlinには一流の関数や拡張メソッドなどの豊富な機能があるため、簡潔な宣言構文やDSLを簡単に作成する機能など、Gradleビルドスクリプトの優れた部分を保持および改善できます。

Gradleチームはこれらの可能性を慎重に検討し、Kotlinチームと緊密に連携して、Gradle用の新しいKotlinベースのビルド言語を開発しました。これをGradle Script Kotlinと呼びます。

Kotlinスクリプトを使用してGradle構成ファイルを作成する方法を簡単に紹介しましょう。

前の章のchapter11_kotlin_springbootプロジェクトを例に考えてみましょう。

まず、ルートディレクトリにsettings.gradle構成ファイルを作成します。

rootProject.name = 'chapter11_kotlin_springboot'
rootProject.buildFileName = 'build.gradle.kts'

Gradleビルドファイル名を「build.gradle.kts」として指定します。
次に、新しい「build.gradle.kts」を作成します。完全なコンテンツは次のとおりです。

buildscript {
    val kotlinVersion = "1.1.3-2"
    val springBootVersion = "2.0.0.M2"
    extra["kotlinVersion"] = kotlinVersion

    repositories {
        mavenCentral()
        maven { setUrl("https://repo.spring.io/snapshot") }
        maven { setUrl("https://repo.spring.io/milestone") }
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:$springBootVersion")
        classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion")
        classpath("org.jetbrains.kotlin:kotlin-allopen:$kotlinVersion")
    }
}

apply {
    plugin("kotlin")
    plugin("kotlin-spring")
    plugin("eclipse")
    plugin("org.springframework.boot")
    plugin("io.spring.dependency-management")
}

version = "0.0.1-SNAPSHOT"

configure<JavaPluginConvention> {
    setSourceCompatibility(1.8)
    setTargetCompatibility(1.8)
}


repositories {
    mavenCentral()
    maven { setUrl("https://repo.spring.io/snapshot") }
    maven { setUrl("https://repo.spring.io/milestone") }
}

val kotlinVersion = extra["kotlinVersion"] as String

dependencies {
    compile("org.springframework.boot:spring-boot-starter-actuator")
    compile("org.springframework.boot:spring-boot-starter-data-jpa")
    compile("org.springframework.boot:spring-boot-starter-freemarker")
    compile("org.springframework.boot:spring-boot-starter-web")
    compile("org.jetbrains.kotlin:kotlin-stdlib-jre8:${kotlinVersion}")
    compile("org.jetbrains.kotlin:kotlin-reflect:${kotlinVersion}")
    runtime("org.springframework.boot:spring-boot-devtools")
    runtime("mysql:mysql-connector-java")
    testCompile("org.springframework.boot:spring-boot-starter-test")
}

ヒント:上記の手順に従って、ファイルbuild.gradle.ktsの作成後にIDEAがこれらのDSL機能を認識しない場合があります。現時点では、IDEAを再起動できます(これはバグであり、後で修正される予定です)。

Gradle DSLの関連する関数とクラスは、Gradleパッケージのlibディレクトリにあります:lib / gradle-script-kotlin-(バージョン番号).jar。次の表を使用して説明します。

関数(クラス) 対応するgradle-script-kotlinコード
ビルドスクリプト funbuildscript(@Suppress(“ unused_pa​​rameter”)ブロックを開く:ScriptHandlerScope。()-> Unit)= Unit
リポジトリ fun ScriptHandler.repositories(configuration:RepositoryHandler。()-> Unit)= repositories.configuration()
buildscript.dependencies DependencyHandlerScope(scriptHandler.dependencies)
構成、設定 inline fun Project.configure(noinline configuration:T.()-> Unit)
Project.dependencies DependencyHandlerScope(dependencies).configuration()

つまり、これらの構成機能は実際にはGradleのDSLによって実装されます。

実際、これらの構成構文はGroovyによく似ています。例えば:

Groovy:

    repositories {
        mavenCentral()
        maven { url "https://repo.spring.io/snapshot" }
        maven { url "https://repo.spring.io/milestone" }
    }

コトリン:

repositories {
    mavenCentral()
    maven { setUrl("https://repo.spring.io/snapshot") }
    maven { setUrl("https://repo.spring.io/milestone") }
}

別の例:
Groovy:

sourceCompatibility = 1.8
targetCompatibility = 1.8

コトリン:

configure<JavaPluginConvention> {
    setSourceCompatibility(1.8)
    setTargetCompatibility(1.8)
}

注意:このセクションのサンプルプロジェクトのソースコードhttps://github.com/EasyKotlin/chapter11_kotlin_springboot/tree/build.gradle.kts

章のまとめ

この章では、Gotleを統合するためにKotlinを使用する開発プロセスにおけるいくつかの一般的な構成方法を簡単に紹介します。Gradleは非常に便利なビルドツールです。Kotlinプロジェクトの構成ファイルもKotlinコードである場合、作業ははるかに簡単になり、Kotlinに集中するだけで済みます。

次の章では、KotlinとAnkoをAndroid開発に使用する方法について学びます。


Kotlin開発者コミュニティ

Java、Kotlin、Spring / Spring Boot、MySQL、redis、neo4j、NoSQL、Android、JavaScript、React、Node、関数型プログラミング、プログラミングのアイデア、「高可用性、高性能、高リアルタイム」の大規模分散システムアーキテクチャ設計の共有に重点を置くテーマ。

高可用性、高性能、高リアルタイムの大規模分散システムアーキテクチャ設計

分散フレームワーク:Zookeeper、分散ミドルウェアフレームワークなど。
分散ストレージ:GridFS、FastDFS、TFS、MemCache、redisなど。
分散データベース:Cobar、tddl、Amoeba、Mycat
クラウドコンピューティング、ビッグデータ、AIアルゴリズム
仮想化、クラウドネイティブテクノロジー
分散コンピューティングフレームワーク:MapReduce、Hadoop、Storm、Flinkなど。
分散通信メカニズム:Dubbo、RPC呼び出し、共有リモートデータ、メッセージキューなど。
メッセージキューMQ:Kafka、MetaQ、RocketMQ
高可用性システムの構築方法:ハードウェア、ソフトウェアに基づくミドルウェアやシステムアーキテクチャなどのいくつかの典型的なソリューションの実現:HAProxy、Corosync + Pacemakerベースの高可用性クラスタースイートミドルウェアシステム
Mycatアーキテクチャ分散進化
ビッグデータ結合の背後にある問題:データ、ネットワーク、メモリ、およびコンピューティング機能の矛盾と調整
Java分散システムの高パフォーマンス問題:AIO、NIO、Netty、または自己開発フレームワーク?
高性能イベントディスパッチメカニズム:スレッドプールモデル、ディスラプターモデルなど

抱きしめる木材は工場の終わりに生まれ、9階建てのプラットフォームは地下室から始まり、千マイルの旅は一歩で始まります。歩数を貯めないと千マイルも届きませんし、小川を貯めないと川にはなりません。

Kotlinの概要

Kotlinは非研究言語であり、非常に実用的な産業グレードのプログラミング言語であり、プログラマーが実際のエンジニアリングの実践における問題を解決するのを支援することを使命としています。Kotlinを使用すると、Javaプログラマーの生活が改善され、Javaのnullポインターエラー、時間を浪費する長いボイラープレートコード、冗長な構文制限などがすべてKotlinでなくなります。Kotlinはシンプルで実用的であり、簡潔で強力な構文、安全で表現力豊か、非常に生産的です。

Javaは1995年に誕生し、23年の歴史があります。現在の最新バージョンはJava 9です。JVMエコシステムの継続的な開発と繁栄の過程で、Scala、Groovy、Clojureなどの兄弟言語も誕生しました。

Kotlinは、JVMファミリーの優れたメンバーでもあります。Kotlinは最新の言語です(バージョン1.0は2016年2月にリリースされました)。その本来の目的は、ScalaのようなJava言語の欠点を最適化し、よりシンプルで実用的なプログラミング言語機能を提供し、コンパイル時間などのパフォーマンスの問題を解決することです。JetBrainsはこれらの分野で素晴らしい仕事をしました。

Kotlin言語の機能

長年Javaで開発した後、何か新しいことを試すことができるのは素晴らしいことです。Java開発者であれば、Kotlinは非常に自然でスムーズです。Swiftの開発者であれば、Nullabilityなどのなじみのあるものに感じるでしょう。Kotlin言語の機能は次のとおりです。

1.簡潔

ボイラープレートコードの量を大幅に削減します。

2. Javaとの100%の相互運用性

KotlinはJavaクラスと直接対話でき、その逆も可能です。この機能により、コードベースを直接再利用してKotlinに移行できます。Javaの相互運用性はほとんどどこにでもあるからです。Kotlinの強力な最新の言語機能をすべて楽しんで使用しながら、プラットフォームAPIと既存のコードベースに直接アクセスできます。

3.拡張機能

KotlinはC#やGosuに似ており、クラスから継承したり、任意のタイプのデザインパターン(デコレーターパターンなど)を使用したりすることなく、既存のクラスに新しい機能拡張を提供する機能を提供します。

4.関数型プログラミング

Kotlin言語は、最初はScalaと同様に関数型プログラミングをサポートしています。高階関数やラムダ式などの基本的な機能を備えています。

5.デフォルトおよび名前付きパラメーター

Kotlinでは、関数のパラメーターのデフォルト値を設定し、各パラメーターに名前を付けることができます。これは読みやすいコードを書くのに役立ちます。

6.強力な開発ツールのサポート

そして、それはJetBrainsによって作成されているため、優れたIDEサポートがあります。JavaからKotlinへの自動変換は100%OKではありませんが、実際には非常に優れたツールです。IDEAのツールを使用してJavaコードをKotlinコードに変換する場合、結果のコードの60%〜70%は簡単に再利用でき、変更のコストはわずかです。

簡潔で強力な構文機能に加えて、Kotlinには非常に実用的なAPIとその周りに構築されたエコシステムもあります。例:コレクションAPI、IO拡張、リフレクションAPIなど。同時に、Kotlinコミュニティは、豊富なドキュメント、多くの学習資料、オンラインREPLも提供しています。

開発者を幸せにする最新のプログラミング言語。永遠にオープンソース

「Kotlinのエントリから高度な戦闘まで」の画像(陳光建、清華大学出版局)

「Kotlinのエントリから高度な戦闘まで」の画像(陳光建、清華大学出版局)

https://kotlinlang.org/

おすすめ

転載: blog.csdn.net/universsky2015/article/details/108669427