ライブラリをアップロードする

ライブラリへのアクセスを許可するには、リポジトリを選択する必要があります。このページでは、リポジトリ タイプの選択に関する考慮事項と、Maven Publish プラグインを使用してパブリケーションを作成する方法について説明します。

ライブラリをアップロードする前に、リリース用のライブラリを準備し、必要なパブリケーション バリアントテスト フィクスチャを構成してください。

リポジトリ タイプを選択する

ライブラリは AAR ファイルとして公開されます。このファイルには、バイトコードとネイティブ ライブラリとしてコンパイルされたコード、Android マニフェスト、リソースが含まれています。パッケージ自体は、ID、バージョン、他のライブラリへの依存関係を宣言しません。

通常、AAR を直接配布するのではなく、リポジトリ経由で AAR を提供することをおすすめします。この方法では、ユーザーはライブラリの提供元をより簡単に把握できます(バージョンなどの重要な詳細情報がない name.aar ファイルを処理する手間を省くことができます)。新しいバージョンのライブラリにアップグレードする場合は、リポジトリを使用すると、新しいバージョンの必須の依存関係のみが追加されるため、ユーザーは手動で依存関係を更新せずに済みます。

リポジトリを使用してライブラリを公開する方法には、次のような複数のメリットがあります。

  • Gradle は、ライブラリの依存関係を依存関係グラフに自動的に追加できます。
  • Gradle は、依存関係グラフにライブラリの単一のバージョンが含まれることを保証し、それによってライブラリが異なるバージョンで推移的に複数回インクルードされる場合の競合を解決します。
  • Android Gradle プラグイン(AGP)は、より効率的な脱糖を行うことで(ライブラリで Java 8 以上の言語機能を使用している場合)、ユーザーのためにビルド時間を短縮できます。
  • ライブラリでバリアントの公開を使用し、テスト フィクスチャなどの機能を含めることができます。

AAR を直接配布する場合、ライブラリの ID、バージョン、依存関係に関する情報はユーザーに提供されません。リポジトリに公開する場合、配布はリポジトリ メカニズムに含まれる別のファイルによって処理されます。これは、Maven リポジトリの場合は POM ファイルです。したがって、AAR ファイルを手動で配布するのではなく、リポジトリを使用してライブラリを公開することを強くおすすめします。

リポジトリのタイプ

リポジトリには次の 3 つのタイプがあります。

  • Maven Central などの無料のオンライン リポジトリ。誰でもライブラリをアップロードでき、ダウンロードできます。
  • 非公開リポジトリ。ログインを介してアクセスが行われるので、非公開ライブラリの配布を管理できます。
  • フォルダベースのローカル リポジトリ。手動ダウンロードを介してライブラリを配布できます。

フォルダベースのローカル リポジトリを使用する方法は、ユーザーに AAR への手動ダウンロード リンクを提供する方法や、メールで AAR を送信する方法とよく似ています。主な違いは、AAR のみを送信するのではなく、ID、バージョン、依存関係に関する追加情報も送信する点です。

AAR とメタデータを含むフォルダベースのリポジトリの ZIP ファイルを配布します。ユーザーはファイルを解凍して中身をプロジェクトに追加し、Gradle で参照できます。それ以降は、あたかもライブラリがオンライン リポジトリに存在するかのように、Maven 座標を使用してライブラリへの依存関係を宣言し、上記のメリットをすべて利用できます。

パブリケーションを作成する

Gradle Maven Publish プラグインを使用して公開します。Maven Publish プラグインにより、パブリケーションとリポジトリを宣言でき、それらのパブリケーションをリポジトリに公開するタスクが作成されます。これらのパブリケーションは、ビルドを駆動するプラグインが作成する SoftwareComponent インスタンス(AGP または java-library プラグイン)を消費します。

なお、AGP を使用して Maven Publish プラグインを実行する場合、プラグインが適用されたときにソフトウェア コンポーネントが直接作成されるわけではありません。代わりに 作成された afterEvaluate() コールバックステップによって行われます。したがって、ソフトウェア コンポーネントを選択するパブリケーションも afterEvaluate() ステップで構成する必要があります。

次に示すモジュール レベルの build.gradle ファイルのコード スニペットは、singleVariant() または multipleVariants() で作成された特定のバリアントのパブリケーションを作成します。

Groovy

publishing {
  publications {
    release(MavenPublication) {
      groupId = 'com.my-company'
      artifactId = 'my-library'
      version = '1.0'

      afterEvaluate {
        from components.release
      }
    }
  }
}

Kotlin

publishing {
  publications {
    register<MavenPublication>("release") {
      groupId = "com.my-company"
      artifactId = "my-library"
      version = "1.0"

      afterEvaluate {
        from(components["release"])
      }
    }
  }
}

上記の例では、コンポーネントの名前(components.release)は、singleVariant() または multipleVariants() のいずれかに付けられた名前に基づいています。

パブリケーションを宣言したら、ターゲット リポジトリを作成する必要があります。

ローカル リポジトリに公開する

ローカル リポジトリへの公開は、リポジトリの宣言を除けば、リモート リポジトリへの公開とよく似ています。リモート リポジトリに公開する方法について前のセクションを参照し、目的のバリアント(1 つまたは複数)を公開するパブリケーションを作成します。その後、ローカル リポジトリを作成します。

Groovy

publishing {
  publications {
    release(MavenPublication) {
      ...
    }
  }
  repositories {
    maven {
      name = 'myrepo'
      url = layout.buildDirectory.dir("repo")
    }
  }
}

Kotlin

publishing {
  publications {
    register<MavenPublication>("release") {
      ...
    }
  }
  repositories {
    maven {
      name = "myrepo"
      url = uri(layout.buildDirectory.dir("repo"))
    }
  }
}

これにより、publishReleaseToMyRepoRepository というタスクが作成されます。この名前は、パブリケーションの名前とリポジトリの名前で構成されます。このタスクを実行すると、指定した場所にリポジトリが生成されます。この例では、プロジェクトのビルドフォルダ内(repo ディレクトリの下)にリポジトリが生成されます。

リポジトリの ZIP ファイルを自動的に生成させる場合は、次のコードを使用します。

Groovy

tasks.register('generateRepo', Zip) {
  def publishTask = tasks.named('publishReleasePublicationToMyrepoRepository')
  from publishTask.map { it.getRepository().getUrl() }
  into 'mylibrary'
  archiveFileName.set('mylibrary.zip')
}

Kotlin

tasks.register<Zip>("generateRepo") {
  val publishTask = tasks.named(
    "publishReleasePublicationToMyrepoRepository",
    PublishToMavenRepository::class.java)
  from(publishTask.map { it.repository.url })
  into("mylibrary")
  archiveFileName.set("mylibrary.zip")
}

このコードは、generateRepo という Zip タスクを作成します。このタスクは、公開タスクの内容を消費して圧縮するとともに、ZIP エントリを mylibrary という最上位フォルダに配置します。出力は build/distributions に配置されます。