Slide 1

Slide 1 text

Bagan, Myanmar @_a_akira How to publish
 a Kotlin Multiplatform Library

Slide 2

Slide 2 text

About me @_a_akira AAkira CyberAgent, Inc. Akira Aratani https://aakira.app "#$%&'()*+,-./012345678 ⊿

Slide 3

Slide 3 text

Agenda • MPPライブラリのパッケージ構成 • MPPライブラリのGradleの設定 • BintrayへのUpload

Slide 4

Slide 4 text

Agenda • Kotlin/Nativeチュートリアル Android, iOS編
 http://aakira.app/blog/2018/10/kotlin-native • Kotlin Multiplatform構想 ~今やる理由編~
 https://aakira.app/blog/2018/12/kotlin-mpp-reason • Kotlin Multiplatform構想 ~設計編~
 https://aakira.app/blog/2018/12/kotlin-mpp-architecture • Kotlin Multiplatform環境でKotlin Serializationと
 Android ExtensionsのParcelize Annotationを使う
 http://aakira.app/blog/2018/12/kotlin-mpp-android-parcelable • NapierというKotlin Multiplatform用のログライブラリを作った
 https://aakira.app/blog/2019/02/napier

Slide 5

Slide 5 text

Agenda • Kotlin/Nativeチュートリアル Android, iOS編
 http://aakira.app/blog/2018/10/kotlin-native • Kotlin Multiplatform構想 ~今やる理由編~
 https://aakira.app/blog/2018/12/kotlin-mpp-reason • Kotlin Multiplatform構想 ~設計編~
 https://aakira.app/blog/2018/12/kotlin-mpp-architecture • Kotlin Multiplatform環境でKotlin Serializationと
 Android ExtensionsのParcelize Annotationを使う
 http://aakira.app/blog/2018/12/kotlin-mpp-android-parcelable • NapierというKotlin Multiplatform用のログライブラリを作った
 https://aakira.app/blog/2019/02/napier

Slide 6

Slide 6 text

Agenda Timber likeなKotlin mpp用ライブラリ https://github.com/AAkira/Napier

Slide 7

Slide 7 text

Agenda

Slide 8

Slide 8 text

Kotlin Multiplatform Libraryの
 パッケージ構成 Yangon, Myanmar

Slide 9

Slide 9 text

パッケージ構成 (~Kotlin1.3) . ├── android │ ├── src │ └── build.gradle (apply plugin: 'kotlin-platform-android') ├── common │ ├── src │ │ └── main │ └── build.gradle (apply plugin: 'kotlin-platform-common') ├── ios │ ├── src │ │ └── main │ └── build.gradle (apply plugin: 'org.jetbrains.kotlin.platform.native') └─── js ├── src │ └── main └── build.gradle (apply plugin: 'kotlin-platform-js')

Slide 10

Slide 10 text

パッケージ構成 (~Kotlin1.3) 各ディレクトリ毎にbuild.gradleがある . ├── android │ ├── src │ └── build.gradle (apply plugin: 'kotlin-platform-android') ├── common │ ├── src │ │ └── main │ └── build.gradle (apply plugin: 'kotlin-platform-common') ├── ios │ ├── src │ │ └── main │ └── build.gradle (apply plugin: 'org.jetbrains.kotlin.platform.native') └─── js ├── src │ └── main └── build.gradle (apply plugin: 'kotlin-platform-js')

Slide 11

Slide 11 text

パッケージ構成 (Kotlin1.3~) . └── library ├── build.gradle (apply plugin: 'kotlin-multiplatform') └── src ├── androidMain ├── androidTest ├── commonMain ├── commonTest ├── iosMain ├── iosTest ├── jsMain ├── jsTest ├── jvmMain └── jvmTest

Slide 12

Slide 12 text

パッケージ構成 (Kotlin1.3~) . └── library ├── build.gradle (apply plugin: 'kotlin-multiplatform') └── src ├── androidMain ├── androidTest ├── commonMain ├── commonTest ├── iosMain ├── iosTest ├── jsMain ├── jsTest ├── jvmMain └── jvmTest build.gradleは1つのみ

Slide 13

Slide 13 text

パッケージ構成 何よりも信頼出来るJakeの力強い "yes"
 @Kotlinlang slack

Slide 14

Slide 14 text

パッケージ構成 (Kotlin1.3~) . └── library ├── build.gradle (apply plugin: 'kotlin-multiplatform') └── src ├── androidMain ├── androidTest ├── commonMain ├── commonTest ├── iosMain ├── iosTest ├── jsMain ├── jsTest ├── jvmMain └── jvmTest build.gradleは1つのみが正しい

Slide 15

Slide 15 text

Talat rotfai ratchada, Bangkok, Thailand Kotlin Multiplatform Libraryの
 Gradle設定

Slide 16

Slide 16 text

Gradle設定 • Common • Android • iOS • JVM • JS 今回配布するライブラリ . ├── library │ ├── android.gradle │ ├── build.gradle │ └── src │ ├── androidMain │ ├── androidTest │ ├── commonMain │ ├── commonTest │ ├── iosMain │ ├── iosTest │ ├── jsMain │ ├── jsTest │ ├── jvmMain │ └── jvmTest └─── build.gradle

Slide 17

Slide 17 text

Gradle設定 • Common • Android • iOS • JVM • JS 今回配布するライブラリ . ├── library │ ├── android.gradle │ ├── build.gradle │ └── src │ ├── androidMain │ ├── androidTest │ ├── commonMain │ ├── commonTest │ ├── iosMain │ ├── iosTest │ ├── jsMain │ ├── jsTest │ ├── jvmMain │ └── jvmTest └─── build.gradle androidは
 「apply plugin: 'com.android.library'」を読み込む &
 android用のSDK version等の記述をする
 必要があるので分ける

Slide 18

Slide 18 text

Gradle設定 IntelliJ IDEAだとデフォルトで用意されている

Slide 19

Slide 19 text

Gradle設定 apply plugin: 'kotlin-multiplatform' apply from: 'android.gradle' apply from: rootProject.file('gradle/publish.gradle') kotlin { android() iosX64('ios') iosArm32('iosArm32') iosArm64('iosArm64') js() jvm() sourceSets { commonMain.dependencies { } commonTest.dependencies { } androidMain.dependencies { } androidTest.dependencies { } iosMain.dependencies { } iosTest.dependencies { } iosArm32Main.dependsOn iosMain iosArm32Test.dependsOn iosTest iosArm64Main.dependsOn iosMain iosArm64Test.dependsOn iosTest jsMain.dependencies { } jsTest.dependencies { } jvmMain.dependencies { } jvmTest.dependencies { } } } library/build.gradle

Slide 20

Slide 20 text

apply plugin: 'kotlin-multiplatform' apply from: 'android.gradle' apply from: rootProject.file('gradle/publish.gradle') kotlin { android() iosX64('ios') iosArm32('iosArm32') iosArm64('iosArm64') js() jvm() sourceSets { commonMain.dependencies { } commonTest.dependencies { } Gradle設定 library/build.gradle

Slide 21

Slide 21 text

apply plugin: 'kotlin-multiplatform' apply from: 'android.gradle' apply from: rootProject.file('gradle/publish.gradle') kotlin { android() iosX64('ios') iosArm32('iosArm32') iosArm64('iosArm64') js() jvm() sourceSets { commonMain.dependencies { } commonTest.dependencies { } Gradle設定 library/build.gradle

Slide 22

Slide 22 text

apply plugin: 'kotlin-multiplatform' apply from: 'android.gradle' apply from: rootProject.file('gradle/publish.gradle') kotlin { android() iosX64('ios') iosArm32('iosArm32') iosArm64('iosArm64') js() jvm() sourceSets { commonMain.dependencies { } commonTest.dependencies { } Gradle設定 android用のgradleは別で定義
 (略) 詳しくはサンプルを見てください library/build.gradle

Slide 23

Slide 23 text

apply plugin: 'kotlin-multiplatform' apply from: 'android.gradle' apply from: rootProject.file('gradle/publish.gradle') kotlin { android() iosX64('ios') iosArm32('iosArm32') iosArm64('iosArm64') js() jvm() sourceSets { commonMain.dependencies { } commonTest.dependencies { } Gradle設定 publish用のgradleは別定義(後述) library/build.gradle

Slide 24

Slide 24 text

apply plugin: 'kotlin-multiplatform' apply from: 'android.gradle' apply from: rootProject.file('gradle/publish.gradle') kotlin { android() iosX64('ios') iosArm32('iosArm32') iosArm64('iosArm64') js() jvm() sourceSets { commonMain.dependencies { } commonTest.dependencies { } Gradle設定 library/build.gradle

Slide 25

Slide 25 text

apply plugin: 'kotlin-multiplatform' apply from: 'android.gradle' apply from: rootProject.file('gradle/publish.gradle') kotlin { android() iosX64('ios') iosArm32('iosArm32') iosArm64('iosArm64') js() jvm() sourceSets { commonMain.dependencies { } commonTest.dependencies { } Gradle設定 Kotlin1.3から書き方が変わった library/build.gradle

Slide 26

Slide 26 text

apply plugin: 'kotlin-multiplatform' apply from: 'android.gradle' apply from: rootProject.file('gradle/publish.gradle') kotlin { targets { fromPreset(presets.android, 'android') fromPreset(presets.iosArm64, 'ios') fromPreset(presets.js, 'js') fromPreset(presets.jvm, 'jvm') } sourceSets { commonMain.dependencies { } commonTest.dependencies { } androidMain.dependencies { } Gradle設定 ~Kotlin1.3 library/build.gradle

Slide 27

Slide 27 text

apply plugin: 'kotlin-multiplatform' apply from: 'android.gradle' apply from: rootProject.file('gradle/publish.gradle') kotlin { android() iosX64('ios') iosArm32('iosArm32') iosArm64('iosArm64') js() jvm() sourceSets { commonMain.dependencies { } commonTest.dependencies { } Gradle設定 library/build.gradle

Slide 28

Slide 28 text

iosArm64('iosArm64') js() jvm() sourceSets { commonMain.dependencies { } commonTest.dependencies { } androidMain.dependencies { } androidTest.dependencies { } iosMain.dependencies { } iosTest.dependencies { } iosArm32Main.dependsOn iosMain iosArm32Test.dependsOn iosTest iosArm64Main.dependsOn iosMain iosArm64Test.dependsOn iosTest jsMain.dependencies { } jsTest.dependencies { } jvmMain.dependencies { } jvmTest.dependencies { } } } Gradle設定 それぞれの依存を定義 library/build.gradle

Slide 29

Slide 29 text

apply plugin: 'kotlin-multiplatform' apply from: 'android.gradle' apply from: rootProject.file('gradle/publish.gradle') kotlin { android() iosX64('ios') iosArm32('iosArm32') iosArm64('iosArm64') js() jvm() sourceSets { commonMain.dependencies { } commonTest.dependencies { } Gradle設定 library/build.gradle

Slide 30

Slide 30 text

apply plugin: 'kotlin-multiplatform' apply from: 'android.gradle' apply from: rootProject.file('gradle/publish.gradle') kotlin { android() iosX64('ios') iosArm32('iosArm32') iosArm64('iosArm64') js() jvm() sourceSets { commonMain.dependencies { } commonTest.dependencies { } Gradle設定 library/build.gradle

Slide 31

Slide 31 text

apply plugin: 'kotlin-multiplatform' apply from: 'android.gradle' apply from: rootProject.file('gradle/publish.gradle') kotlin { android { publishLibraryVariants("release") } iosX64('ios') iosArm32('iosArm32') iosArm64('iosArm64') js() jvm() sourceSets { Gradle設定 library/build.gradle android libraryは
 release buildを指定する必要がある

Slide 32

Slide 32 text

apply plugin: 'maven-publish' def pomConfig = { licenses { license { name POM_LICENSE_NAME url POM_LICENSE_URL distribution POM_LICENSE_DIST } } developers { developer { id POM_DEVELOPER_ID name POM_DEVELOPER_NAME organization POM_ORGANIZATION_NAME organizationUrl POM_ORGANIZATION_URL } } scm { url SITE_URL } } afterEvaluate { project.publishing.publications.all { pom.withXml { def root = asNode() root.appendNode('name', project.name) root.appendNode('description', POM_DESCRIPTION) root.appendNode('url', SITE_URL) root.children().last() + pomConfig } groupId = BINTRAY_PACKAGE if (it.name.contains('metadata')) { artifactId = "${project.name}" } else { artifactId = "${project.name}-$name" } } } Gradle設定 - Maven Publish - gradle/publish.gradle

Slide 33

Slide 33 text

apply plugin: 'maven-publish' def pomConfig = { licenses { license { name POM_LICENSE_NAME url POM_LICENSE_URL distribution POM_LICENSE_DIST } } developers { developer { id POM_DEVELOPER_ID name POM_DEVELOPER_NAME organization POM_ORGANIZATION_NAME organizationUrl POM_ORGANIZATION_URL } } scm { url SITE_URL } } Gradle設定 - Maven Publish - gradle/publish.gradle

Slide 34

Slide 34 text

apply plugin: 'maven-publish' def pomConfig = { licenses { license { name POM_LICENSE_NAME url POM_LICENSE_URL distribution POM_LICENSE_DIST } } developers { developer { id POM_DEVELOPER_ID name POM_DEVELOPER_NAME organization POM_ORGANIZATION_NAME organizationUrl POM_ORGANIZATION_URL } } scm { url SITE_URL } } Gradle設定 - Maven Publish - gradle/publish.gradle maven publish pluginをapply

Slide 35

Slide 35 text

apply plugin: 'maven-publish' def pomConfig = { licenses { license { name POM_LICENSE_NAME url POM_LICENSE_URL distribution POM_LICENSE_DIST } } developers { developer { id POM_DEVELOPER_ID name POM_DEVELOPER_NAME organization POM_ORGANIZATION_NAME organizationUrl POM_ORGANIZATION_URL } } scm { url SITE_URL } } Gradle設定 - Maven Publish - gradle/publish.gradle pomに書き込む用の変数を定義

Slide 36

Slide 36 text

apply plugin: 'maven-publish' def pomConfig = { licenses { license { name "The Apache Software License, Version 2.0" url "http://www.apache.org/licenses/LICENSE-2.0.txt" distribution "repo" } } developers { developer { id "aakira" name "aakira" organization "aakira" organizationUrl "https://github.com/aakira" } } scm { url "https://github.com/aakira/Napier" } } Gradle設定 - Maven Publish - gradle/publish.gradle 実際の中身

Slide 37

Slide 37 text

apply plugin: 'maven-publish' def pomConfig = { licenses { license { name POM_LICENSE_NAME url POM_LICENSE_URL distribution POM_LICENSE_DIST } } developers { developer { id POM_DEVELOPER_ID name POM_DEVELOPER_NAME organization POM_ORGANIZATION_NAME organizationUrl POM_ORGANIZATION_URL } } scm { url SITE_URL } } Gradle設定 - Maven Publish - gradle/publish.gradle

Slide 38

Slide 38 text

organization POM_ORGANIZATION_NAME organizationUrl POM_ORGANIZATION_URL } } scm { url SITE_URL } } afterEvaluate { project.publishing.publications.all { pom.withXml { def root = asNode() root.appendNode('name', project.name) root.appendNode('description', POM_DESCRIPTION) root.appendNode('url', SITE_URL) root.children().last() + pomConfig } groupId = BINTRAY_PACKAGE if (it.name.contains('metadata')) { artifactId = "${project.name}" } else { artifactId = "${project.name}-$name" } } } Gradle設定 - Maven Publish - gradle/publish.gradle publishで作られる成果物に全てに対して

Slide 39

Slide 39 text

organization POM_ORGANIZATION_NAME organizationUrl POM_ORGANIZATION_URL } } scm { url SITE_URL } } afterEvaluate { project.publishing.publications.all { pom.withXml { def root = asNode() root.appendNode('name', project.name) root.appendNode('description', POM_DESCRIPTION) root.appendNode('url', SITE_URL) root.children().last() + pomConfig } groupId = BINTRAY_PACKAGE if (it.name.contains('metadata')) { artifactId = "${project.name}" } else { artifactId = "${project.name}-$name" } } } Gradle設定 - Maven Publish - gradle/publish.gradle xmlを作成

Slide 40

Slide 40 text

organization POM_ORGANIZATION_NAME organizationUrl POM_ORGANIZATION_URL } } scm { url SITE_URL } } afterEvaluate { project.publishing.publications.all { pom.withXml { def root = asNode() root.appendNode('name', project.name) root.appendNode('description', POM_DESCRIPTION) root.appendNode('url', SITE_URL) root.children().last() + pomConfig } groupId = BINTRAY_PACKAGE if (it.name.contains('metadata')) { artifactId = "${project.name}" } else { artifactId = "${project.name}-$name" } } } Gradle設定 - Maven Publish - gradle/publish.gradle 先程指定した変数を追加

Slide 41

Slide 41 text

organization POM_ORGANIZATION_NAME organizationUrl POM_ORGANIZATION_URL } } scm { url SITE_URL } } afterEvaluate { project.publishing.publications.all { pom.withXml { def root = asNode() root.appendNode('name', project.name) root.appendNode('description', POM_DESCRIPTION) root.appendNode('url', SITE_URL) root.children().last() + pomConfig } groupId = BINTRAY_PACKAGE if (it.name.contains('metadata')) { artifactId = "${project.name}" } else { artifactId = "${project.name}-$name" } } } Gradle設定 - Maven Publish - gradle/publish.gradle

Slide 42

Slide 42 text

organization POM_ORGANIZATION_NAME organizationUrl POM_ORGANIZATION_URL } } scm { url SITE_URL } } afterEvaluate { project.publishing.publications.all { pom.withXml { def root = asNode() root.appendNode('name', project.name) root.appendNode('description', POM_DESCRIPTION) root.appendNode('url', SITE_URL) root.children().last() + pomConfig } groupId = BINTRAY_PACKAGE if (it.name.contains('metadata')) { artifactId = "${project.name}" } else { artifactId = "${project.name}-$name" } } } Gradle設定 - Maven Publish - gradle/publish.gradle metadataをrename

Slide 43

Slide 43 text

organization POM_ORGANIZATION_NAME organizationUrl POM_ORGANIZATION_URL } } scm { url SITE_URL } } afterEvaluate { project.publishing.publications.all { pom.withXml { def root = asNode() root.appendNode('name', project.name) root.appendNode('description', POM_DESCRIPTION) root.appendNode('url', SITE_URL) root.children().last() + pomConfig } groupId = BINTRAY_PACKAGE if (it.name.contains('metadata')) { artifactId = "${project.name}" } else { artifactId = "${project.name}-$name" } } } Gradle設定 - Maven Publish - gradle/publish.gradle metadata=commonMainの部分のこと

Slide 44

Slide 44 text

organization POM_ORGANIZATION_NAME organizationUrl POM_ORGANIZATION_URL } } scm { url SITE_URL } } afterEvaluate { project.publishing.publications.all { pom.withXml { def root = asNode() root.appendNode('name', project.name) root.appendNode('description', POM_DESCRIPTION) root.appendNode('url', SITE_URL) root.children().last() + pomConfig } groupId = BINTRAY_PACKAGE if (it.name.contains('metadata')) { artifactId = "${project.name}" } else { artifactId = "${project.name}-$name" } } } Gradle設定 - Maven Publish - gradle/publish.gradle commonMainはsuffixなし
 他はsuffixに環境名をつける e.g. napier-android, napier-js

Slide 45

Slide 45 text

Gradle設定 - Maven Publish - pom-default.xml The Apache Software License, Version 2.0 http://www.apache.org/licenses/LICENSE-2.0.txt repo aakira aakira aakira https://github.com/aakira https://github.com/aakira/Napier

Slide 46

Slide 46 text

Gradle設定 - Maven Publish - • publish • publishAndroidReleasePublicationToMavenLocal • publishIosArm32PublicationToMavenLocal • publishIosArm64PublicationToMavenLocal • publishIosPublicationToMavenLocal • publishJsPublicationToMavenLocal • publishJvmPublicationToMavenLocal • publishKotlinMultiplatformPublicationToMavenLocal • publishMetadataPublicationToMavenLocal • publishToMavenLocal targetの数だけmaven publishに関するtaskが作られる

Slide 47

Slide 47 text

Gradle設定 - Maven Publish - $ ./gradlew publishToMavenLocal build └── publications ├── androidRelease │ ├── module.json │ └── pom-default.xml ├── ios │ ├── module.json │ └── pom-default.xml ├── iosArm32 │ ├── module.json │ └── pom-default.xml ├── iosArm64 │ ├── module.json │ └── pom-default.xml ├── js │ ├── module.json │ └── pom-default.xml ├── jvm │ ├── module.json │ └── pom-default.xml ├── kotlinMultiplatform │ ├── module.json │ └── pom-default.xml └── metadata ├── module.json └── pom-default.xml

Slide 48

Slide 48 text

build └── publications ├── androidRelease │ ├── module.json │ └── pom-default.xml ├── ios │ ├── module.json │ └── pom-default.xml ├── iosArm32 │ ├── module.json │ └── pom-default.xml ├── iosArm64 │ ├── module.json │ └── pom-default.xml ├── js Gradle設定 - Maven Publish - oMavenLocal

Slide 49

Slide 49 text

├── iosArm32 │ ├── module.json │ └── pom-default.xml ├── iosArm64 │ ├── module.json │ └── pom-default.xml ├── js │ ├── module.json │ └── pom-default.xml ├── jvm │ ├── module.json │ └── pom-default.xml ├── kotlinMultiplatform │ ├── module.json │ └── pom-default.xml └── metadata ├── module.json └── pom-default.xml Gradle設定 - Maven Publish - oMavenLocal

Slide 50

Slide 50 text

Gradle設定 - Gradle Publish - /build.gradle buildscript { repositories { ... } dependencies { ... classpath "com.jfrog.bintray.gradle:gradle-bintray-plugin:1.8.4" ... } } https://github.com/bintray/gradle-bintray-plugin

Slide 51

Slide 51 text

apply plugin: 'com.jfrog.bintray' def getBintrayUserProperty() { return hasProperty('bintrayUser') ? project.property('bintrayUser') : System.getenv('BINTRAY_USER') } def getBintrayApiKeyProperty() { return hasProperty('bintrayApiKey') ? project.property('bintrayApiKey') : System.getenv('BINTRAY_API_KEY') } bintray { user = getBintrayUserProperty() key = getBintrayApiKeyProperty() publish = false pkg { repo = BINTRAY_REPOSITORY name = BINTRAY_NAME userOrg = GROUP licenses = ['Apache-2.0'] vcsUrl = VCS_URL websiteUrl = SITE_URL issueTrackerUrl = ISSUE_URL version { name = rootProject.ext.LIBRARY_VERSION_NAME vcsTag = rootProject.ext.LIBRARY_VERSION_NAME released = new Date() } } } bintrayUpload.doFirst { publications = publishing.publications.collect { it.name }.findAll { it != "kotlinMultiplatform" } } bintrayUpload.dependsOn publishToMavenLocal Gradle設定 - Gradle Publish - gradle/publish.gradle

Slide 52

Slide 52 text

apply plugin: 'com.jfrog.bintray' def getBintrayUserProperty() { return hasProperty('bintrayUser') ? project.property('bintrayUser') : System.getenv('BINTRAY_USER') } def getBintrayApiKeyProperty() { return hasProperty('bintrayApiKey') ? project.property('bintrayApiKey') : System.getenv('BINTRAY_API_KEY') } bintray { user = getBintrayUserProperty() key = getBintrayApiKeyProperty() publish = false pkg { repo = BINTRAY_REPOSITORY name = BINTRAY_NAME userOrg = GROUP licenses = ['Apache-2.0'] vcsUrl = VCS_URL websiteUrl = SITE_URL issueTrackerUrl = ISSUE_URL Gradle設定 - Gradle Publish - gradle/publish.gradle

Slide 53

Slide 53 text

apply plugin: 'com.jfrog.bintray' def getBintrayUserProperty() { return hasProperty('bintrayUser') ? project.property('bintrayUser') : System.getenv('BINTRAY_USER') } def getBintrayApiKeyProperty() { return hasProperty('bintrayApiKey') ? project.property('bintrayApiKey') : System.getenv('BINTRAY_API_KEY') } bintray { user = getBintrayUserProperty() key = getBintrayApiKeyProperty() publish = false pkg { repo = BINTRAY_REPOSITORY name = BINTRAY_NAME userOrg = GROUP licenses = ['Apache-2.0'] vcsUrl = VCS_URL websiteUrl = SITE_URL issueTrackerUrl = ISSUE_URL Gradle設定 - Gradle Publish - gradle/publish.gradle bintrayのpluginをapply

Slide 54

Slide 54 text

apply plugin: 'com.jfrog.bintray' def getBintrayUserProperty() { return hasProperty('bintrayUser') ? project.property('bintrayUser') : System.getenv('BINTRAY_USER') } def getBintrayApiKeyProperty() { return hasProperty('bintrayApiKey') ? project.property('bintrayApiKey') : System.getenv('BINTRAY_API_KEY') } bintray { user = getBintrayUserProperty() key = getBintrayApiKeyProperty() publish = false pkg { repo = BINTRAY_REPOSITORY name = BINTRAY_NAME userOrg = GROUP licenses = ['Apache-2.0'] vcsUrl = VCS_URL websiteUrl = SITE_URL issueTrackerUrl = ISSUE_URL Gradle設定 - Gradle Publish - gradle/publish.gradle bintrayのuser名, API Keyを読み込む gitに追加されないlocalの
 ~/.gradle/gradle.properties に書いておくと良い

Slide 55

Slide 55 text

def getBintrayApiKeyProperty() { return hasProperty('bintrayApiKey') ? project.property('bintrayApiKey') : System.getenv('BINTRAY_API_KEY') } bintray { user = getBintrayUserProperty() key = getBintrayApiKeyProperty() publish = false pkg { repo = BINTRAY_REPOSITORY name = BINTRAY_NAME userOrg = GROUP licenses = ['Apache-2.0'] vcsUrl = VCS_URL websiteUrl = SITE_URL issueTrackerUrl = ISSUE_URL version { name = rootProject.ext.LIBRARY_VERSION_NAME vcsTag = rootProject.ext.LIBRARY_VERSION_NAME released = new Date() } } } Gradle設定 - Gradle Publish - gradle/publish.gradle

Slide 56

Slide 56 text

def getBintrayApiKeyProperty() { return hasProperty('bintrayApiKey') ? project.property('bintrayApiKey') : System.getenv('BINTRAY_API_KEY') } bintray { user = getBintrayUserProperty() key = getBintrayApiKeyProperty() publish = false pkg { repo = BINTRAY_REPOSITORY name = BINTRAY_NAME userOrg = GROUP licenses = ['Apache-2.0'] vcsUrl = VCS_URL websiteUrl = SITE_URL issueTrackerUrl = ISSUE_URL version { name = rootProject.ext.LIBRARY_VERSION_NAME vcsTag = rootProject.ext.LIBRARY_VERSION_NAME released = new Date() } } } Gradle設定 - Gradle Publish - gradle/publish.gradle keyをセット

Slide 57

Slide 57 text

def getBintrayApiKeyProperty() { return hasProperty('bintrayApiKey') ? project.property('bintrayApiKey') : System.getenv('BINTRAY_API_KEY') } bintray { user = getBintrayUserProperty() key = getBintrayApiKeyProperty() publish = false pkg { repo = BINTRAY_REPOSITORY name = BINTRAY_NAME userOrg = GROUP licenses = ['Apache-2.0'] vcsUrl = VCS_URL websiteUrl = SITE_URL issueTrackerUrl = ISSUE_URL version { name = rootProject.ext.LIBRARY_VERSION_NAME vcsTag = rootProject.ext.LIBRARY_VERSION_NAME released = new Date() } } } Gradle設定 - Gradle Publish - gradle/publish.gradle upload後すぐに公開しない

Slide 58

Slide 58 text

def getBintrayApiKeyProperty() { return hasProperty('bintrayApiKey') ? project.property('bintrayApiKey') : System.getenv('BINTRAY_API_KEY') } bintray { user = getBintrayUserProperty() key = getBintrayApiKeyProperty() publish = false pkg { repo = BINTRAY_REPOSITORY name = BINTRAY_NAME userOrg = GROUP licenses = ['Apache-2.0'] vcsUrl = VCS_URL websiteUrl = SITE_URL issueTrackerUrl = ISSUE_URL version { name = rootProject.ext.LIBRARY_VERSION_NAME vcsTag = rootProject.ext.LIBRARY_VERSION_NAME released = new Date() } } } Gradle設定 - Gradle Publish - gradle/publish.gradle

Slide 59

Slide 59 text

def getBintrayApiKeyProperty() { return hasProperty('bintrayApiKey') ? project.property('bintrayApiKey') : System.getenv('BINTRAY_API_KEY') } bintray { user = getBintrayUserProperty() key = getBintrayApiKeyProperty() publish = false pkg { repo = 'maven' name = 'napier' userOrg = 'aakira' licenses = ['Apache-2.0'] vcsUrl = 'https://github.com/aakira/Napier.git' websiteUrl = 'https://github.com/aakira/Napier' issueTrackerUrl = 'https://github.com/aakira/Napier/issues' version { name = '0.0.1' vcsTag = '0.0.1' released = new Date() } } } Gradle設定 - Gradle Publish - gradle/publish.gradle

Slide 60

Slide 60 text

def getBintrayApiKeyProperty() { return hasProperty('bintrayApiKey') ? project.property('bintrayApiKey') : System.getenv('BINTRAY_API_KEY') } bintray { user = getBintrayUserProperty() key = getBintrayApiKeyProperty() publish = false pkg { repo = BINTRAY_REPOSITORY name = BINTRAY_NAME userOrg = GROUP licenses = ['Apache-2.0'] vcsUrl = VCS_URL websiteUrl = SITE_URL issueTrackerUrl = ISSUE_URL version { name = rootProject.ext.LIBRARY_VERSION_NAME vcsTag = rootProject.ext.LIBRARY_VERSION_NAME released = new Date() } } } Gradle設定 - Gradle Publish - gradle/publish.gradle

Slide 61

Slide 61 text

version { name = rootProject.ext.LIBRARY_VERSION_NAME vcsTag = rootProject.ext.LIBRARY_VERSION_NAME released = new Date() } } } bintrayUpload.doFirst { publications = publishing.publications.collect { it.name }.findAll { it != "kotlinMultiplatform" } } bintrayUpload.dependsOn publishToMavenLocal Gradle設定 - Gradle Publish - gradle/publish.gradle bintrayにuploadするpublicationsを指定

Slide 62

Slide 62 text

version { name = rootProject.ext.LIBRARY_VERSION_NAME vcsTag = rootProject.ext.LIBRARY_VERSION_NAME released = new Date() } } } bintrayUpload.doFirst { publications = publishing.publications.collect { it.name }.findAll { it != "kotlinMultiplatform" } } bintrayUpload.dependsOn publishToMavenLocal Gradle設定 - Gradle Publish - gradle/publish.gradle [project name]-kotlinMultiplatform
 というディレクトリがアップロードされてしまうので除外

Slide 63

Slide 63 text

version { name = rootProject.ext.LIBRARY_VERSION_NAME vcsTag = rootProject.ext.LIBRARY_VERSION_NAME released = new Date() } } } bintrayUpload.doFirst { publications = publishing.publications.collect { it.name }.findAll { it != "kotlinMultiplatform" } } bintrayUpload.dependsOn publishToMavenLocal Gradle設定 - Gradle Publish - gradle/publish.gradle bintrayUpload taskにpublishToMavenLocalを依存させる

Slide 64

Slide 64 text

Wat Arun, Bangkok, Thailand BintrayへのUpload

Slide 65

Slide 65 text

BintrayへのUpload

Slide 66

Slide 66 text

BintrayへのUpload 今回はMavenを選択 
 publish.gradleのBINTRAY_REPOSITORYと一致

Slide 67

Slide 67 text

BintrayへのUpload

Slide 68

Slide 68 text

BintrayへのUpload UI変わった

Slide 69

Slide 69 text

BintrayへのUpload BINTRAY_NAME ISSUE_URL VCS_URL SITE_URL

Slide 70

Slide 70 text

BintrayへのUpload $ ./gradlew clean $ ./gradlew bintrayUpload

Slide 71

Slide 71 text

BintrayへのUpload

Slide 72

Slide 72 text

BintrayへのUpload Publish allを選択すると公開される

Slide 73

Slide 73 text

BintrayへのUpload /build.gradle buildscript { repositories { ... maven { url "http://dl.bintray.com/[bintray repository]/[bintray name]" } ... } }

Slide 74

Slide 74 text

BintrayへのUpload /build.gradle buildscript { repositories { ... maven { url "http://dl.bintray.com/[bintray repository]/[bintray name]" } ... } } ライブラリ毎にmavenのrepositoryを書かないといけない

Slide 75

Slide 75 text

BintrayへのUpload 右上のActionから選択

Slide 76

Slide 76 text

BintrayへのUpload それっぽい説明をちゃんと書く

Slide 77

Slide 77 text

BintrayへのUpload /build.gradle buildscript { repositories { jcenter() } }

Slide 78

Slide 78 text

Wat Paknam, Bangkok, Thailand Summary

Slide 79

Slide 79 text

Summary • Kotlin1.3からはgradleを1つにした構成にしましょう • metadataの成果物はcommonのこと • androidの配布はreleaseを明示的に書く必要あり • ライブラリをローカルで参照する方法はサンプルを(時間の都合) • Napierのpublish.gradleコピペすればすぐ上げられる
 (先人の犠牲を無駄にするな...)

Slide 80

Slide 80 text

Have a nice Kotlin @_a_akira Bagan, Myanmar