Kotlinマルチプラットフォームライブラリの作成 – チュートリアル
このチュートリアルではIntelliJ IDEAを使用していますが、Android Studioでも進めることができます。両方のIDEは共通のコア機能とKotlinマルチプラットフォームのサポートを共有しています。
このチュートリアルでは、IntelliJ IDEAでマルチプラットフォームライブラリを作成し、そのライブラリをローカルのMavenリポジトリに公開して、別のプロジェクトで依存関係として追加する方法を学びます。
このチュートリアルは、フィボナッチ数列を生成する関数を含むシンプルなライブラリである multiplatform library template に基づいています。
環境のセットアップ
必要なツールをすべてインストールし、最新バージョンにアップデートしてください。
プロジェクトの作成
IntelliJ IDEAで、File | New | Project from Version Control を選択します。
multiplatform library template project のURLを入力します:
texthttps://github.com/Kotlin/multiplatform-library-templateClone をクリックします。
プロジェクト構造の確認
Kotlin Multiplatform library templateプロジェクトは、Kotlinマルチプラットフォームライブラリを開発するための基礎となる構造を提供します。このテンプレートは、さまざまなプラットフォームで動作可能なライブラリの作成を支援します。
テンプレートプロジェクトにおいて、libraryはコアモジュールとして機能し、マルチプラットフォームライブラリのメインソースコードとビルドリソースが含まれています。

libraryモジュールは、共有コードとプラットフォーム固有の実装を収容できるように構成されています。以下は、ソースコードの内訳です。
commonMain: すべてのターゲットプラットフォームで共有されるKotlinコードが含まれます。プラットフォーム固有のAPIに依存しないコードはここに配置します。androidMain,iosMain,jvmMain,linuxX64Main: Android、iOS、JVM、Linuxプラットフォーム固有のコードが含まれます。これらのプラットフォームに固有の機能をここに実装します。commonTest,androidUnitTest,iosTest,jvmTest,linuxX64Test: それぞれ、共有コードであるcommonMainのテスト、およびAndroid、iOS、JVM、Linuxの各プラットフォーム固有のテストが含まれます。
すべてのプラットフォームで共有されるlibraryコードに注目してみましょう。src/commonMain/kotlinディレクトリの中に、フィボナッチ数列ジェネレーターを定義するKotlinマルチプラットフォームコードを含むCustomFibi.ktファイルがあります。
package io.github.kotlin.fibonacci
// フィボナッチ数列を生成する関数を定義
fun generateFibi() = sequence {
var a = firstElement
yield(a)
var b = secondElement
yield(b)
while (true) {
val c = a + b
yield(c)
a = b
b = c
}
}
// `firstElement` と `secondElement` の期待される値を宣言
expect val firstElement: Int
expect val secondElement: IntfirstElementとsecondElementプロパティは、プラットフォーム固有のコードで実装されるプレースホルダーです。各ターゲットは、それぞれのソースセットでactualキーワードを使用して実際の値を提供する必要があります。
expect宣言は、actual実装と対応(マッチ)します。このメカニズムは、プラットフォーム固有の動作を必要とするクロスプラットフォームコードを記述する際に便利です。
このケースでは、マルチプラットフォームライブラリテンプレートにはfirstElementとsecondElementプロパティのプラットフォーム固有の実装が含まれています。androidMain、iosMain、jvmMain、linuxX64Mainディレクトリには、これらのプロパティに値を提供するactual宣言が含まれています。
例えば、androidMain/kotlin/fibiprops.android.ktに含まれるAndroidの実装は以下の通りです。
package io.github.kotlin.fibonacci
actual val firstElement: Int = 1
actual val secondElement: Int = 2他のプラットフォームも同じパターンに従い、firstElementとsecondElementプロパティの値がそれぞれ異なります。
新しいプラットフォームの追加
テンプレートでの共有コードとプラットフォーム固有コードの仕組みを理解したところで、追加のプラットフォームのサポートを追加してプロジェクトを拡張してみましょう。
expect/actualメカニズムを使用して、Kotlin/Wasmプラットフォームのサポートを構成し、firstElementとsecondElementプロパティに対してプラットフォーム固有の機能を実装します。
プロジェクトにKotlin/Wasmターゲットを追加する
library/build.gradle.ktsファイルに、Kotlin/Wasmターゲット(wasmJs)とソースセットを追加します。kotlinkotlin { // ... @OptIn(org.jetbrains.kotlin.gradle.ExperimentalWasmDsl::class) wasmJs { browser() binaries.executable() } // ... sourceSets { //... wasmJsMain.dependencies { // Wasm固有の依存関係 } } }ビルドファイルに表示されるSync Gradle Changesアイコン(
)をクリックして、Gradleファイルを同期します。あるいは、Gradleツールウィンドウのリフレッシュボタンをクリックします。
Wasm用のプラットフォーム固有コードを作成する
Wasmターゲットを追加した後は、firstElementとsecondElementのプラットフォーム固有の実装を保持するためのWasmディレクトリが必要です。
library/srcディレクトリを右クリックし、New | Directoryを選択します。Gradle Source SetsリストからwasmJsMain/kotlinを選択します。

新しく作成された
wasmJsMain/kotlinディレクトリを右クリックし、New | Kotlin Class/Fileを選択します。ファイル名としてfibiprops.wasmを入力し、Fileを選択します。
fibiprops.wasm.ktファイルに以下のコードを追加します。kotlinpackage io.github.kotlin.fibonacci actual val firstElement: Int = 3 actual val secondElement: Int = 5このコードは、Wasm固有の実装を設定し、
firstElementを3、secondElementを5としてactual値を定義します。
プロジェクトのビルド
新しいプラットフォームでプロジェクトが正しくコンパイルされることを確認します。
View | Tool Windows | Gradle を選択して、Gradleツールウィンドウを開きます。
multiplatform-library-template | library | Tasks | build の中で、buildタスクを実行します。

あるいは、
multiplatform-library-templateのルートディレクトリからターミナルで次のコマンドを実行します。bash./gradlew build
Buildツールウィンドウで成功の出力を確認できます。
ローカルMavenリポジトリへのライブラリの公開
マルチプラットフォームライブラリをローカルに公開する準備が整いました。これにより、同じマシン上の他のプロジェクトでそのライブラリを使用できるようになります。
ライブラリを公開するには、次のようにmaven-publish Gradleプラグインを使用します。
library/build.gradle.ktsファイルで、plugins { }ブロックを見つけ、maven-publishプラグインを適用します。kotlinplugins { // ... // 次の行を追加します: id("maven-publish") }mavenPublishing { }ブロックを見つけ、公開がローカルのみであることを示すためにsignAllPublications()の呼び出しをコメントアウトします。kotlinmavenPublishing { // ... // 次の呼び出しをコメントアウトします: // signAllPublications() }ビルドファイルに表示されるSync Gradle Changesアイコン(
)をクリックして、Gradleファイルを同期します。あるいは、Gradleツールウィンドウのリフレッシュボタンをクリックします。Gradleツールウィンドウで、multiplatform-library-template | Tasks | publishing に移動し、publishToMavenLocal Gradleタスクを実行します。

あるいは、
multiplatform-library-templateのルートディレクトリからターミナルで次のコマンドを実行します。bash./gradlew publishToMavenLocal
ライブラリがローカルのMavenリポジトリに公開されました。
公開されたアーティファクトを確認するには、ファイルエクスプローラーまたはターミナルを使用して、~\.m2\repository\io\github\kotlin\library\1.0.0\ ディレクトリに移動します。
別のプロジェクトに依存関係としてライブラリを追加する
マルチプラットフォームライブラリをローカルのMavenリポジトリに公開した後、同じマシン上の他のKotlinプロジェクトで使用できます。
コンシューマープロジェクト(利用側プロジェクト)のsettings.gradle.ktsファイルに、ローカルリポジトリでパッケージを探すためのオプションを追加します。
dependencyResolutionManagement {
repositories {
// ...
mavenLocal()
}
}モジュールのbuild.gradle.ktsファイルで、公開されたライブラリへの依存関係を追加します。別のマルチプラットフォームプロジェクトに追加する場合は、共有またはプラットフォーム固有のソースセットに追加できます。
kotlin {
//...
sourceSets {
// すべてのプラットフォーム用
commonMain.dependencies {
implementation("io.github.kotlin:library:1.0.0")
}
// または特定のプラットフォーム用
wasmJsMain.dependencies {
implementation("io.github.kotlin:library:1.0.0")
}
}
}implementation()の呼び出しには、ライブラリのbuild.gradle.ktsファイルで指定されたグループ、名前、バージョンを指定します。
コンシューマープロジェクトを同期して、ライブラリの使用を開始しましょう。例えば以下のようになります:
import io.github.kotlin.fibonacci.generateFibi
val seq = generateFibi()
println(seq.elementAt(3))次のステップ
マルチプラットフォーム開発をさらに深く探究することをお勧めします:
コミュニティに参加する:
Compose Multiplatform GitHub: リポジトリをスターして貢献する
Kotlin Slack: 招待を受けて、#multiplatform チャンネルに参加する
Stack Overflow: "kotlin-multiplatform" タグを購読する
Kotlin YouTube チャンネル: 購読して Kotlinマルチプラットフォームに関するビデオを視聴する
