Kotlinで作ったライブラリをリリースする

Androidアプリを作る際にAPIサーバーとの通信部分をモジュール化したいことはよくあると思います。このような場合にKotlinでクラスを作ってライブラリとして公開するためのチュートリアルです。なお筆者はAndroid初心者。

ここで作るライブラリはAndroidのパッケージではなくただのKotlinのクラスです。

## 準備
まずは**ターミナルから**新しく作業ディレクトリを作成します。

```bash
mkdir -p my-project/src/main/java/com/asmsuechan/example
gradle -v
```

モジュールの作成はAndroid Studioからでも可能なのですが単体で作成することができないみたいなのでまずはターミナルから始めます。一度ビルドすればAndroidStudioでモジュールとしてimportすればIDEの恩恵が受けられます。

なお`gradle -v`が実行できなかった人は各自gradleをインストールしてください。

## Exampleクラスの追加
`src/main/java/com/asmsuechan/example`にExample.ktを作成します。サンプルなのでprintするだけのシンプルなコードです。

```kotlin
class Example {
  fun bark () {
    print("Bow wow!")
  }
}
```

## build.gradle.ktsの追加
プロジェクトルートに`build.gradle.kts`を追加して以下を書きます。

```kotlin
import org.gradle.jvm.tasks.Jar
import com.jfrog.bintray.gradle.BintrayExtension

group = "com.asmsuechan"
version = "0.0.1"
val artifactID = "kotlin-gradle-bintray-example"
val publicationName = "default"

plugins {
  `maven-publish`
  kotlin("jvm") version "1.3.70"
  id("com.jfrog.bintray") version "1.8.5"
}

repositories {
  jcenter()
}

dependencies {
    implementation(kotlin("stdlib"))
}

val sourcesJar by tasks.registering(Jar::class) {
    classifier = "sources"
    from(sourceSets.main.get().allSource)
}

publishing {
  publications {
    create<MavenPublication>("default") {
      from(components["java"])
    }
  }

  publications.invoke {
    publicationName(MavenPublication::class) {
      artifactId = artifactID
      artifact(sourcesJar.get())
    }
  }
}

fun findProperty(s: String) = project.findProperty(s) as String?
bintray {
    user = findProperty("bintrayUser")
    key = findProperty("bintrayApiKey")
    publish = true
    setPublications(publicationName)
    pkg(delegateClosureOf<BintrayExtension.PackageConfig> {
        repo = "asmsuechan"
        name = "kotlin-gradle-bintray-example"
        userOrg = "asmsuechan"
        websiteUrl = "https://github.com/asmsuechan/kotlin-gradle-bintray-example"
        githubRepo = "asmsuechan/kotlin-gradle-bintray-example"
        vcsUrl = "https://github.com/asmsuechan/kotlin-gradle-bintray-example"
        description = ""
        setLabels("kotlin")
        setLicenses("MIT")
        desc = description
    })
}
```

## pom.xmlの追加
プロジェクトルートに`pom.xml`を追加します。

```xml
<project>
    <groupId>com.asmsuechan</groupId>
    <artifactId>kotlin-gradle-bintray-example</artifactId>
    <version>0.0.1</version>

    <packaging>jar</packaging>

    <name>kotlin-gradle-bintray-example</name>
    <url>https://github.com/asmsuechan/kotlin-gradle-bintray-example</url>
</project>
```

今の所フォルダ構成はこんな感じ。

```
$ tree
.
├── build.gradle.kts
├── pom.xml
└── src
    └── main
        └── java
            └── com
                └── asmsuechan
                    └── example
                        └── Example.kt
```

## bintrayへの登録
[bintray](https://bintray.com/)というサービスを使って作成したライブラリを公開します。bintrayとは簡単に言うとJavaScriptのnpmみたいなサービスです。

登録はこちら([jCenterでライブラリを公開する方法](https://qiita.com/ryo_mm2d/items/da49cc4677847c20c3fb))などを参考にしてやってみてください。

## publishする
以下のコマンドを打ってbintrayにpublishします。API Keyはbintrayのマイページにあります。

```bash
gradle clean build bintrayUpload -PbintrayUser=YourNameHere -PbintrayApiKey=YourTokenHere -PdryRun=false
```

Publishしたら最初は`Add to jcenter`ボタンを押してjcenterにライブラリを登録する必要があります。

## 完成
適当なAndroidプロジェクトを作成してbuild.gradleのdependenciesにimplementationを書けば正しくライブラリが使えるようになるはずです。

```
dependencies {
    ....(中略)
    implementation 'com.asmsuechan:kotlin-gradle-bintray-example:0.0.1'
}
```

## 参考
https://guides.gradle.org/building-kotlin-jvm-libraries/