From 490a539516ab2ddd4294004198ebcc9acf5f6799 Mon Sep 17 00:00:00 2001 From: Anton Shestak Date: Wed, 30 Jun 2021 14:41:02 +0700 Subject: [PATCH] #29 use convention-plugin --- .github/workflows/compilation-check.yml | 8 +- .github/workflows/publish.yml | 6 +- README.md | 3 +- build.gradle.kts | 22 +-- gradle/libs.versions.toml | 10 +- parcelize-build-logic/build.gradle.kts | 17 ++ .../kotlin/android-app-convention.gradle.kts | 32 ++++ .../kotlin/android-base-convention.gradle.kts | 14 ++ .../android-library-convention.gradle.kts | 13 ++ .../android-publication-convention.gradle.kts | 15 ++ .../main/kotlin/detekt-convention.gradle.kts | 15 ++ .../kotlin/javadoc-stub-convention.gradle.kts | 16 ++ ...ultiplatform-library-convention.gradle.kts | 59 +++++++ .../kotlin/publication-convention.gradle.kts | 92 +++++++++++ parcelize/build.gradle.kts | 145 +----------------- sample/android-app/build.gradle.kts | 28 +--- sample/mpp-library/build.gradle.kts | 6 +- settings.gradle.kts | 15 ++ 18 files changed, 313 insertions(+), 203 deletions(-) create mode 100644 parcelize-build-logic/build.gradle.kts create mode 100644 parcelize-build-logic/src/main/kotlin/android-app-convention.gradle.kts create mode 100644 parcelize-build-logic/src/main/kotlin/android-base-convention.gradle.kts create mode 100644 parcelize-build-logic/src/main/kotlin/android-library-convention.gradle.kts create mode 100644 parcelize-build-logic/src/main/kotlin/android-publication-convention.gradle.kts create mode 100644 parcelize-build-logic/src/main/kotlin/detekt-convention.gradle.kts create mode 100644 parcelize-build-logic/src/main/kotlin/javadoc-stub-convention.gradle.kts create mode 100644 parcelize-build-logic/src/main/kotlin/multiplatform-library-convention.gradle.kts create mode 100644 parcelize-build-logic/src/main/kotlin/publication-convention.gradle.kts diff --git a/.github/workflows/compilation-check.yml b/.github/workflows/compilation-check.yml index f8e3fe6..bbc6488 100644 --- a/.github/workflows/compilation-check.yml +++ b/.github/workflows/compilation-check.yml @@ -14,15 +14,15 @@ jobs: os: [macos-latest, windows-latest, ubuntu-latest] steps: - uses: actions/checkout@v1 - - name: Set up JDK 1.8 + - name: Set up JDK 11 uses: actions/setup-java@v1 with: - java-version: 1.8 + java-version: 11 - name: Check build - run: ./gradlew build publishToMavenLocal + run: ./gradlew build publishToMavenLocal syncMultiPlatformLibraryDebugFrameworkIosX64 - name: Install pods run: cd sample/ios-app && pod install if: matrix.os == 'macOS-latest' - name: Check iOS - run: cd sample/ios-app && xcodebuild -scheme TestProj -workspace TestProj.xcworkspace -configuration Debug build CODE_SIGNING_REQUIRED=NO CODE_SIGNING_ALLOWED=NO + run: cd sample/ios-app && xcodebuild -scheme TestProj -workspace TestProj.xcworkspace -configuration Debug -sdk iphonesimulator -arch x86_64 build CODE_SIGNING_REQUIRED=NO CODE_SIGNING_ALLOWED=NO | xcpretty if: matrix.os == 'macOS-latest' diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index ebbc193..1a1f3e0 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -23,10 +23,10 @@ jobs: os: [macos-latest, windows-latest, ubuntu-latest] steps: - uses: actions/checkout@v1 - - name: Set up JDK 1.8 + - name: Set up JDK 11 uses: actions/setup-java@v1 with: - java-version: 1.8 + java-version: 11 - name: Publish run: ./gradlew publish -DIS_MAIN_HOST=${{ matrix.os == 'ubuntu-latest' }} release: @@ -42,6 +42,6 @@ jobs: with: commitish: ${{ github.ref }} tag_name: release/${{ github.event.inputs.version }} - release_name: Release ${{ github.event.inputs.version }} + release_name: ${{ github.event.inputs.version }} body: "Will be filled later" draft: true diff --git a/README.md b/README.md index 896f619..9f0be76 100755 --- a/README.md +++ b/README.md @@ -37,7 +37,7 @@ allprojects { project build.gradle ```groovy dependencies { - commonMainApi("dev.icerock.moko:parcelize:0.7.0") + commonMainApi("dev.icerock.moko:parcelize:0.7.1") } ``` @@ -63,6 +63,7 @@ Please see more examples in the [sample directory](sample). ## Set Up Locally - The [parcelize directory](parcelize) contains the `parcelize` library; - The [sample directory](sample) contains sample apps for Android and iOS; plus the mpp-library connected to the apps. +- For publish to MavenLocal repository run `./gradlew publishToMavenLocal -DIS_MAIN_HOST=true` ## Contributing All development (both new features and bug fixes) is performed in the `develop` branch. This way `master` always contains the sources of the most recently released version. Please send PRs with bug fixes to the `develop` branch. Documentation fixes in the markdown files are an exception to this rule. They are updated directly in `master`. diff --git a/build.gradle.kts b/build.gradle.kts index bdcb830..28a54b5 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -6,28 +6,16 @@ buildscript { repositories { mavenCentral() google() + gradlePluginPortal() } dependencies { - classpath("dev.icerock:mobile-multiplatform:0.9.2") - classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.20") - classpath("com.android.tools.build:gradle:4.2.1") + classpath(":parcelize-build-logic") } } allprojects { - repositories { - mavenCentral() - google() - } - - plugins.withId("com.android.library") { - configure { - compileSdkVersion(libs.versions.compileSdk.get().toInt()) - - defaultConfig { - minSdkVersion(libs.versions.minSdk.get().toInt()) - targetSdkVersion(libs.versions.targetSdk.get().toInt()) - } - } + plugins.withId("org.gradle.maven-publish") { + group = "dev.icerock.moko" + version = libs.versions.mokoParcelizeVersion.get() } } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 5220bd4..125bd1c 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,10 +1,6 @@ [versions] -androidAppCompatVersion = "1.1.0" -mokoParcelizeVersion = "0.7.0" -compileSdk = "28" -targetSdk = "28" -minSdk = "16" +androidAppCompatVersion = "1.2.0" +mokoParcelizeVersion = "0.7.1" [libraries] -appCompat = { module = "androidx.appcompat:appcompat", version.ref = "androidAppCompatVersion" } -mokoParcelize = { module = "dev.icerock.moko:parcelize", version.ref = "mokoParcelizeVersion" } \ No newline at end of file +appCompat = { module = "androidx.appcompat:appcompat", version.ref = "androidAppCompatVersion" } \ No newline at end of file diff --git a/parcelize-build-logic/build.gradle.kts b/parcelize-build-logic/build.gradle.kts new file mode 100644 index 0000000..84cbae3 --- /dev/null +++ b/parcelize-build-logic/build.gradle.kts @@ -0,0 +1,17 @@ +plugins { + `kotlin-dsl` +} + +repositories { + mavenCentral() + google() + + gradlePluginPortal() +} + +dependencies { + api("dev.icerock:mobile-multiplatform:0.12.0") + api("org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.20") + api("com.android.tools.build:gradle:4.2.1") + api("io.gitlab.arturbosch.detekt:detekt-gradle-plugin:1.15.0") +} diff --git a/parcelize-build-logic/src/main/kotlin/android-app-convention.gradle.kts b/parcelize-build-logic/src/main/kotlin/android-app-convention.gradle.kts new file mode 100644 index 0000000..2859874 --- /dev/null +++ b/parcelize-build-logic/src/main/kotlin/android-app-convention.gradle.kts @@ -0,0 +1,32 @@ +/* + * Copyright 2021 IceRock MAG Inc. Use of this source code is governed by the Apache 2.0 license. + */ + +plugins { + id("com.android.application") + id("android-base-convention") + id("kotlin-android") +} + +android { + dexOptions { + javaMaxHeapSize = "2g" + } + + buildTypes { + getByName("release") { + isMinifyEnabled = true + proguardFiles(getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro") + } + getByName("debug") { + isDebuggable = true + applicationIdSuffix = ".debug" + } + } + + packagingOptions { + exclude("META-INF/*.kotlin_module") + exclude("META-INF/AL2.0") + exclude("META-INF/LGPL2.1") + } +} diff --git a/parcelize-build-logic/src/main/kotlin/android-base-convention.gradle.kts b/parcelize-build-logic/src/main/kotlin/android-base-convention.gradle.kts new file mode 100644 index 0000000..7f67285 --- /dev/null +++ b/parcelize-build-logic/src/main/kotlin/android-base-convention.gradle.kts @@ -0,0 +1,14 @@ +/* + * Copyright 2021 IceRock MAG Inc. Use of this source code is governed by the Apache 2.0 license. + */ + +import com.android.build.gradle.BaseExtension + +configure { + compileSdkVersion(30) + + defaultConfig { + minSdkVersion(16) + targetSdkVersion(30) + } +} diff --git a/parcelize-build-logic/src/main/kotlin/android-library-convention.gradle.kts b/parcelize-build-logic/src/main/kotlin/android-library-convention.gradle.kts new file mode 100644 index 0000000..c435401 --- /dev/null +++ b/parcelize-build-logic/src/main/kotlin/android-library-convention.gradle.kts @@ -0,0 +1,13 @@ +/* + * Copyright 2021 IceRock MAG Inc. Use of this source code is governed by the Apache 2.0 license. + */ + +plugins { + id("com.android.library") + id("kotlin-android") + id("android-base-convention") +} + +android { + sourceSets.all { java.srcDir("src/$name/kotlin") } +} diff --git a/parcelize-build-logic/src/main/kotlin/android-publication-convention.gradle.kts b/parcelize-build-logic/src/main/kotlin/android-publication-convention.gradle.kts new file mode 100644 index 0000000..b4dae9e --- /dev/null +++ b/parcelize-build-logic/src/main/kotlin/android-publication-convention.gradle.kts @@ -0,0 +1,15 @@ +/* + * Copyright 2021 IceRock MAG Inc. Use of this source code is governed by the Apache 2.0 license. + */ + +plugins { + id("publication-convention") +} + +afterEvaluate { + publishing.publications { + create("release", MavenPublication::class.java) { + from(components.getByName("release")) + } + } +} diff --git a/parcelize-build-logic/src/main/kotlin/detekt-convention.gradle.kts b/parcelize-build-logic/src/main/kotlin/detekt-convention.gradle.kts new file mode 100644 index 0000000..68343a8 --- /dev/null +++ b/parcelize-build-logic/src/main/kotlin/detekt-convention.gradle.kts @@ -0,0 +1,15 @@ +/* + * Copyright 2021 IceRock MAG Inc. Use of this source code is governed by the Apache 2.0 license. + */ + +plugins { + id("io.gitlab.arturbosch.detekt") +} + +detekt { + input.setFrom("src/commonMain/kotlin", "src/androidMain/kotlin", "src/iosMain/kotlin", "src/main/kotlin") +} + +dependencies { + "detektPlugins"("io.gitlab.arturbosch.detekt:detekt-formatting:1.15.0") +} diff --git a/parcelize-build-logic/src/main/kotlin/javadoc-stub-convention.gradle.kts b/parcelize-build-logic/src/main/kotlin/javadoc-stub-convention.gradle.kts new file mode 100644 index 0000000..a1a2691 --- /dev/null +++ b/parcelize-build-logic/src/main/kotlin/javadoc-stub-convention.gradle.kts @@ -0,0 +1,16 @@ +/* + * Copyright 2021 IceRock MAG Inc. Use of this source code is governed by the Apache 2.0 license. + */ + +plugins { + id("org.gradle.maven-publish") +} + +val javadocJar by tasks.registering(Jar::class) { + archiveClassifier.set("javadoc") +} + +publishing.publications.withType { + // Stub javadoc.jar artifact + artifact(javadocJar.get()) +} diff --git a/parcelize-build-logic/src/main/kotlin/multiplatform-library-convention.gradle.kts b/parcelize-build-logic/src/main/kotlin/multiplatform-library-convention.gradle.kts new file mode 100644 index 0000000..a9a6d70 --- /dev/null +++ b/parcelize-build-logic/src/main/kotlin/multiplatform-library-convention.gradle.kts @@ -0,0 +1,59 @@ +/* + * Copyright 2021 IceRock MAG Inc. Use of this source code is governed by the Apache 2.0 license. + */ + +plugins { + id("com.android.library") + id("org.jetbrains.kotlin.multiplatform") + id("android-base-convention") + id("dev.icerock.mobile.multiplatform.android-manifest") +} + +kotlin { + macosX64("macOS") + tvos() + watchos() + jvm() + js(BOTH) { + nodejs() + browser() + } + linux() + windows() + wasm32() + + sourceSets { + all { + languageSettings.apply { + useExperimentalAnnotation("kotlin.RequiresOptIn") + } + } + + val commonMain by getting + + val notAndroidMain by creating { + dependsOn(commonMain) + } + + val intermediateSourceSets = listOf(commonMain, notAndroidMain) + matching { sourceSet -> + !sourceSet.name.startsWith("android") && sourceSet !in intermediateSourceSets + }.all { + dependsOn(notAndroidMain) + } + } +} + +fun org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension.linux() { + linuxArm64() + linuxArm32Hfp() + linuxMips32() + linuxMipsel32() + linuxX64() +} + +fun org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension.windows() { + mingwX64() + mingwX86() +} + diff --git a/parcelize-build-logic/src/main/kotlin/publication-convention.gradle.kts b/parcelize-build-logic/src/main/kotlin/publication-convention.gradle.kts new file mode 100644 index 0000000..aa54922 --- /dev/null +++ b/parcelize-build-logic/src/main/kotlin/publication-convention.gradle.kts @@ -0,0 +1,92 @@ +/* + * Copyright 2021 IceRock MAG Inc. Use of this source code is governed by the Apache 2.0 license. + */ + +import java.util.Base64 + +plugins { + id("javadoc-stub-convention") + id("org.gradle.maven-publish") + id("signing") +} + +publishing { + repositories.maven("https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/") { + name = "OSSRH" + + credentials { + username = System.getenv("OSSRH_USER") + password = System.getenv("OSSRH_KEY") + } + } + + // Make sure to avoid duplicate publications + val publicationsFromMainHost = listOf( + "wasm32", + "jvm", + "js", + "kotlinMultiplatform", + "androidRelease", + "androidDebug", + "linuxArm64", + "linuxArm32Hfp", + "linuxX64" + ) + + publications + .matching { it.name in publicationsFromMainHost } + .all { + val targetPublication = this@all + tasks.withType() + .matching { it.publication == targetPublication } + .all { onlyIf { System.getProperty("IS_MAIN_HOST") == "true" } } + } + + publications.withType { + + // Provide artifacts information requited by Maven Central + pom { + name.set("MOKO parcelize") + description.set("@Parcelize support for android from common code in Kotlin Multiplatform") + url.set("https://github.com/icerockdev/moko-parcelize") + licenses { + license { + name.set("Apache-2.0") + distribution.set("repo") + url.set("https://github.com/icerockdev/moko-parcelize/blob/master/LICENSE.md") + } + } + + developers { + developer { + id.set("Alex009") + name.set("Aleksey Mikhailov") + email.set("aleksey.mikhailov@icerockdev.com") + } + developer { + id.set("nrobi144") + name.set("Nagy Robert") + email.set("nagyrobi144@gmail.com") + } + } + + scm { + connection.set("scm:git:ssh://github.com/icerockdev/moko-parcelize.git") + developerConnection.set("scm:git:ssh://github.com/icerockdev/moko-parcelize.git") + url.set("https://github.com/icerockdev/moko-parcelize") + } + } + } + + signing { + val signingKeyId: String? = System.getenv("SIGNING_KEY_ID") + val signingPassword: String? = System.getenv("SIGNING_PASSWORD") + val signingKey: String? = System.getenv("SIGNING_KEY")?.let { base64Key -> + String(Base64.getDecoder().decode(base64Key)) + } + if (signingKeyId != null) { + useInMemoryPgpKeys(signingKeyId, signingKey, signingPassword) + sign(publishing.publications) + } + } +} diff --git a/parcelize/build.gradle.kts b/parcelize/build.gradle.kts index f5ae6db..d82e2d5 100644 --- a/parcelize/build.gradle.kts +++ b/parcelize/build.gradle.kts @@ -2,151 +2,12 @@ * Copyright 2019 IceRock MAG Inc. Use of this source code is governed by the Apache 2.0 license. */ -import java.util.Base64 -import kotlin.text.String - plugins { - id("com.android.library") - id("org.jetbrains.kotlin.multiplatform") + id("multiplatform-library-convention") id("kotlin-parcelize") - id("dev.icerock.mobile.multiplatform") - id("maven-publish") - id("signing") + id("dev.icerock.mobile.multiplatform.android-manifest") + id("publication-convention") } group = "dev.icerock.moko" version = libs.versions.mokoParcelizeVersion.get() - - -kotlin { - macosX64("macOS") - tvos() - watchos() - jvm() - js(BOTH) { - nodejs() - browser() - } - linux() - windows() - wasm32() - - sourceSets { - all { - languageSettings.apply { - useExperimentalAnnotation("kotlin.RequiresOptIn") - } - } - - val commonMain by getting - - val notAndroidMain by creating { - dependsOn(commonMain) - } - - val intermediateSourceSets = listOf(commonMain, notAndroidMain) - matching { sourceSet -> - !sourceSet.name.startsWith("android") && sourceSet !in intermediateSourceSets - }.all { - dependsOn(notAndroidMain) - } - } -} - -fun org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension.linux() { - linuxArm64() - linuxArm32Hfp() - linuxMips32() - linuxMipsel32() - linuxX64() -} - -fun org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension.windows() { - mingwX64() - mingwX86() -} - -val javadocJar by tasks.registering(Jar::class) { - archiveClassifier.set("javadoc") -} - -publishing { - repositories.maven("https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/") { - name = "OSSRH" - - credentials { - username = System.getenv("OSSRH_USER") - password = System.getenv("OSSRH_KEY") - } - } - - // Make sure to avoid duplicate publications - val publicationsFromMainHost = listOf( - "wasm32", - "jvm", - "js", - "kotlinMultiplatform", - "androidRelease", - "androidDebug", - "linuxArm64", - "linuxArm32Hfp", - "linuxX64" - ) - - publications - .matching { it.name in publicationsFromMainHost } - .all { - val targetPublication = this@all - tasks.withType() - .matching { it.publication == targetPublication } - .all { onlyIf { System.getProperty("IS_MAIN_HOST") == "true" } } - } - - publications.withType { - // Stub javadoc.jar artifact - artifact(javadocJar.get()) - - // Provide artifacts information requited by Maven Central - pom { - name.set("MOKO parcelize") - description.set("@Parcelize support for android from common code in Kotlin Multiplatform") - url.set("https://github.com/icerockdev/moko-parcelize") - licenses { - license { - url.set("https://github.com/icerockdev/moko-parcelize/blob/master/LICENSE.md") - } - } - - developers { - developer { - id.set("Alex009") - name.set("Aleksey Mikhailov") - email.set("aleksey.mikhailov@icerockdev.com") - } - developer { - id.set("nrobi144") - name.set("Nagy Robert") - email.set("nagyrobi144@gmail.com") - } - } - - scm { - connection.set("scm:git:ssh://github.com/icerockdev/moko-parcelize.git") - developerConnection.set("scm:git:ssh://github.com/icerockdev/moko-parcelize.git") - url.set("https://github.com/icerockdev/moko-parcelize") - } - } - } - - signing { - val signingKeyId: String? = System.getenv("SIGNING_KEY_ID") - val signingPassword: String? = System.getenv("SIGNING_PASSWORD") - val signingKey: String? = System.getenv("SIGNING_KEY")?.let { base64Key -> - String(Base64.getDecoder().decode(base64Key)) - } - if (signingKeyId != null) { - useInMemoryPgpKeys(signingKeyId, signingKey, signingPassword) - sign(publishing.publications) - } - } -} diff --git a/sample/android-app/build.gradle.kts b/sample/android-app/build.gradle.kts index 0a80c36..24dd376 100644 --- a/sample/android-app/build.gradle.kts +++ b/sample/android-app/build.gradle.kts @@ -3,45 +3,19 @@ */ plugins { - id("com.android.application") + id("android-app-convention") id("kotlin-android") id("kotlin-kapt") } android { - compileSdkVersion(libs.versions.compileSdk.get().toInt()) - buildFeatures.dataBinding = true - dexOptions { - javaMaxHeapSize = "2g" - } - defaultConfig { - minSdkVersion(libs.versions.minSdk.get().toInt()) - targetSdkVersion(libs.versions.targetSdk.get().toInt()) - applicationId = "dev.icerock.moko.samples.parcelize" versionCode = 1 versionName = "0.1.0" - - vectorDrawables.useSupportLibrary = true - } - - buildTypes { - getByName("release") { - isMinifyEnabled = false - proguardFiles(getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro") - } - getByName("debug") { - isDebuggable = true - applicationIdSuffix = ".debug" - } - } - - packagingOptions { - exclude("META-INF/*.kotlin_module") } } diff --git a/sample/mpp-library/build.gradle.kts b/sample/mpp-library/build.gradle.kts index 6a5db7a..5e27c61 100644 --- a/sample/mpp-library/build.gradle.kts +++ b/sample/mpp-library/build.gradle.kts @@ -4,10 +4,12 @@ plugins { id("com.android.library") + id("android-base-convention") + id("detekt-convention") id("org.jetbrains.kotlin.multiplatform") - id("dev.icerock.mobile.multiplatform") + id("dev.icerock.mobile.multiplatform.android-manifest") id("kotlin-parcelize") - id("dev.icerock.mobile.multiplatform.apple-framework") + id("dev.icerock.mobile.multiplatform.ios-framework") } kotlin { diff --git a/settings.gradle.kts b/settings.gradle.kts index c002aa1..7fad740 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -5,6 +5,21 @@ enableFeaturePreview("VERSION_CATALOGS") enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS") +dependencyResolutionManagement { + repositories { + mavenCentral() + google() + + jcenter { + content { + includeGroup("org.jetbrains.kotlinx") + } + } + } +} + +includeBuild("parcelize-build-logic") + include(":parcelize") include(":sample:android-app") include(":sample:mpp-library")