Skip to content

マルチプラットフォームライブラリの公開設定

マルチプラットフォームライブラリの公開は、様々な場所に対して設定できます。

ローカルMavenリポジトリへの公開

maven-publish Gradleプラグインを使用すると、マルチプラットフォームライブラリをローカルMavenリポジトリに公開できます。

  1. shared/build.gradle.ktsファイルに、maven-publish Gradleプラグインを追加します。

  2. ライブラリのグループとバージョン、および公開するリポジトリを指定します。

    kotlin
    plugins {
        // ...
        id("maven-publish")
    }
    
    group = "com.example"
    version = "1.0"
    
    publishing {
        repositories {
            maven {
                //...
            }
        }
    }

maven-publishと組み合わせて使用すると、Kotlinプラグインは現在のホストでビルド可能な各ターゲットに対して自動的に公開物を作成します。ただし、Androidターゲットは公開を設定するための追加の手順が必要です。

公開物の構造

Kotlinマルチプラットフォームライブラリの公開物には、複数のMaven公開物が含まれており、それぞれが特定のターゲットに対応しています。さらに、ライブラリ全体を表す傘となる_root_公開物であるkotlinMultiplatformも公開されます。

共通ソースセット依存関係として追加すると、root公開物は適切なプラットフォーム固有のアーティファクトに自動的に解決されます。

ターゲット固有およびroot公開物

KotlinマルチプラットフォームGradleプラグインは、各ターゲットに対して個別の公開物を構成します。 以下のプロジェクト構成を考えてみましょう。

kotlin
// projectName = "lib"
group = "test"
version = "1.0"

kotlin {
    jvm()
    iosX64()
    iosArm64()
}

この設定により、以下のMaven公開物が生成されます。

ターゲット固有の公開物

  • jvmターゲットの場合:test:lib-jvm:1.0
  • iosX64ターゲットの場合: test:lib-iosx64:1.0
  • iosArm64ターゲットの場合:test:lib-iosarm64:1.0

各ターゲット固有の公開物は独立しています。たとえば、publishJvmPublicationTo<MavenRepositoryName>を実行すると、JVMモジュールのみが公開され、他のモジュールは未公開のままになります。

Root公開物

kotlinMultiplatform root公開物: test:lib:1.0

root公開物は、すべてのターゲット固有の公開物を参照するエントリポイントとして機能します。 メタデータアーティファクトを含み、他の公開物(個々のプラットフォームアーティファクトの期待されるURLと座標)への参照を含めることで、適切な依存関係の解決を保証します。

  • Maven Centralなど一部のリポジトリでは、rootモジュールに分類子 (classifier) のないJARアーティファクト(例: kotlinMultiplatform-1.0.jar)が含まれている必要があります。Kotlinマルチプラットフォームプラグインは、必要なアーティファクトを埋め込まれたメタデータアーティファクトとともに自動的に生成します。これにより、リポジトリの要件を満たすためにライブラリのrootモジュールに空のアーティファクトを追加する必要がなくなります。

    JARアーティファクトの生成については、GradleMavenのビルドシステムで詳細を確認してください。

  • リポジトリが必要とする場合、kotlinMultiplatform公開物にもソースとドキュメントのアーティファクトが必要になることがあります。その場合は、公開のスコープでartifact()を使用します。

完全なライブラリの公開

必要なすべてのアーティファクトを1つのステップで公開するには、publishAllPublicationsTo<MavenRepositoryName>という傘となるタスクを使用します。例:

bash
./gradlew publishAllPublicationsToGithubPackagesRepository

Maven Localに公開する場合は、特別なタスクを使用できます。

bash
./gradlew publishToMavenLocal

これらのタスクは、すべてのターゲット固有およびroot公開物が一緒に公開されることを保証し、ライブラリを依存関係の解決に完全に利用できるようにします。

または、個別の公開タスクを使用することもできます。まずroot公開を実行します。

bash
./gradlew publishKotlinMultiplatformPublicationToMavenLocal

このタスクは、ターゲット固有の公開に関する情報を含む*.moduleファイルを公開しますが、ターゲット自体は未公開のままです。プロセスを完了するには、各ターゲット固有の公開物を個別に公開します。

bash
./gradlew publish<TargetName>PublicationToMavenLocal

これにより、すべてのアーティファクトが利用可能で、正しく参照されることが保証されます。

ホストの要件

Kotlin/Nativeはクロスコンパイルをサポートしており、どのホストでも必要な.klibアーティファクトを生成できます。ただし、いくつか留意すべき具体的な点があります。

Appleターゲットのコンパイル

Appleターゲットを含むプロジェクトのアーティファクトを生成するには、通常、Appleマシンが必要です。 ただし、他のホストを使用したい場合は、gradle.propertiesファイルでこのオプションを設定します。

none
kotlin.native.enableKlibsCrossCompilation=true

クロスコンパイルは現在Experimental(試験的)であり、いくつかの制限があります。以下の場合はMacマシンを使用する必要があります。

公開物の重複

公開時の問題を避けるため、リポジトリでの公開物の重複を避けるために、すべてのアーティファクトを単一のホストから公開してください。例えば、Maven Centralは公開物の重複を明示的に禁止しており、プロセスは失敗します。

Androidライブラリの公開

Androidライブラリを公開するには、追加の構成が必要です。

デフォルトでは、Androidライブラリのアーティファクトは公開されません。Androidビルドバリアントによって生成されたアーティファクトを公開するには、shared/build.gradle.ktsファイルのAndroidターゲットブロックでバリアント名を指定します。

kotlin
kotlin {
    androidTarget {
        publishLibraryVariants("release")
    }
}

この例は、プロダクトフレーバーを持たないAndroidライブラリで機能します。 プロダクトフレーバーを持つライブラリの場合、バリアント名にはfooBarDebugfooBarReleaseのようなフレーバーも含まれます。

デフォルトの公開設定は以下のとおりです。

  • 公開されるバリアントが同じビルドタイプ(例えば、すべてreleaseまたはdebug)の場合、それらはどのコンシューマビルドタイプとも互換性があります。
  • 公開されるバリアントが異なるビルドタイプの場合、公開されたバリアントに含まれないコンシューマビルドタイプと互換性があるのはリリースバリアントのみです。他のすべてのバリアント(debugなど)は、コンシューマプロジェクトがマッチングフォールバックを指定しない限り、コンシューマ側で同じビルドタイプにのみ一致します。

公開されるAndroidバリアントすべてを、ライブラリコンシューマが使用する同じビルドタイプのみと互換性を持たせたい場合は、このGradleプロパティを設定します: kotlin.android.buildTypeAttribute.keep=true

プロダクトフレーバーごとにバリアントをグループ化して公開することもできます。これにより、異なるビルドタイプの出力が単一のモジュールに配置され、ビルドタイプがアーティファクトの分類子 (classifier) になります(リリースビルドタイプは引き続き分類子なしで公開されます)。このモードはデフォルトで無効になっており、shared/build.gradle.ktsファイルで次のように有効にできます。

kotlin
kotlin {
    androidTarget {
        publishLibraryVariantsGroupedByFlavor = true
    }
}

異なる依存関係を持つ場合にプロダクトフレーバーごとにバリアントをグループ化して公開することは推奨されません。それらの依存関係は1つの依存関係リストにマージされるためです。

ソース公開の無効化

デフォルトでは、KotlinマルチプラットフォームGradleプラグインは、指定されたすべてのターゲットのソースを公開します。しかし、shared/build.gradle.ktsファイルでwithSourcesJar() APIを使用してソース公開を設定し、無効にすることができます。

  • すべてのターゲットのソース公開を無効にする場合:

    kotlin
    kotlin {
        withSourcesJar(publish = false)
    
        jvm()
        linuxX64()
    }
  • 指定されたターゲットのみのソース公開を無効にする場合:

    kotlin
    kotlin {
         // JVMのみソース公開を無効にする:
        jvm {
            withSourcesJar(publish = false)
        }
        linuxX64()
    }
  • 指定されたターゲット以外のすべてのターゲットのソース公開を無効にする場合:

    kotlin
    kotlin {
        // JVM以外のすべてのターゲットでソース公開を無効にする:
        withSourcesJar(publish = false)
    
        jvm {
            withSourcesJar(publish = true)
        }
        linuxX64()
    }

JVM環境属性公開の無効化

Kotlin 2.0.0以降、Gradle属性org.gradle.jvm.environmentは、KotlinマルチプラットフォームライブラリのJVMバリアントとAndroidバリアントを区別するために、すべてのKotlinバリアントとともに自動的に公開されます。この属性は、どのライブラリバリアントがどのJVM環境に適しているかを示し、Gradleはこの情報を使用してプロジェクトの依存関係の解決を助けます。ターゲット環境は「android」、「standard-jvm」、または「no-jvm」になります。

この属性の公開を無効にするには、gradle.propertiesファイルに以下のGradleプロパティを追加します。

none
kotlin.publishJvmEnvironmentAttribute=false

ライブラリのプロモーション

あなたのライブラリは、JetBrainsの検索プラットフォームで紹介される可能性があります。これは、ターゲットプラットフォームに基づいてKotlinマルチプラットフォームライブラリを簡単に検索できるように設計されています。

条件を満たすライブラリは自動的に追加されます。ライブラリを追加する方法の詳細については、FAQを参照してください。

次のステップ