From ebbd33aa7524cc86506ec2e8f252db34759940c4 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Wed, 24 Jul 2019 15:03:12 +0300 Subject: [PATCH] Added distribution task to JS plugins --- .../kotlin/scientifik/ScientifikExtension.kt | 1 - .../kotlin/scientifik/ScientifikJSPlugin.kt | 63 ++++++++++++------- .../kotlin/scientifik/ScientifikJVMPlugin.kt | 36 +++++------ .../kotlin/scientifik/ScientifikMPPlugin.kt | 58 +++++++++-------- .../scientifik/ScientifikNativePlugin.kt | 40 ++++++++++++ src/main/kotlin/scientifik/common.kt | 20 ++++++ 6 files changed, 142 insertions(+), 76 deletions(-) create mode 100644 src/main/kotlin/scientifik/ScientifikNativePlugin.kt create mode 100644 src/main/kotlin/scientifik/common.kt diff --git a/src/main/kotlin/scientifik/ScientifikExtension.kt b/src/main/kotlin/scientifik/ScientifikExtension.kt index 32ca29e..5b59291 100644 --- a/src/main/kotlin/scientifik/ScientifikExtension.kt +++ b/src/main/kotlin/scientifik/ScientifikExtension.kt @@ -9,7 +9,6 @@ open class ScientifikExtension { var vcs: String? = null var bintrayRepo: String? = null var kdoc: Boolean = true - internal var native = false var serialization = false var atomicfu = false var io = false diff --git a/src/main/kotlin/scientifik/ScientifikJSPlugin.kt b/src/main/kotlin/scientifik/ScientifikJSPlugin.kt index 12f6b34..a6833eb 100644 --- a/src/main/kotlin/scientifik/ScientifikJSPlugin.kt +++ b/src/main/kotlin/scientifik/ScientifikJSPlugin.kt @@ -3,11 +3,10 @@ package scientifik import Scientifik import org.gradle.api.Plugin import org.gradle.api.Project -import org.gradle.kotlin.dsl.configure -import org.gradle.kotlin.dsl.get -import org.gradle.kotlin.dsl.maven -import org.gradle.kotlin.dsl.repositories +import org.gradle.api.tasks.Copy +import org.gradle.kotlin.dsl.* import org.jetbrains.kotlin.gradle.dsl.KotlinJsProjectExtension +import org.jetbrains.kotlin.gradle.targets.js.webpack.KotlinWebpack open class ScientifikJSPlugin : Plugin { override fun apply(project: Project) { @@ -19,39 +18,55 @@ open class ScientifikJSPlugin : Plugin { plugins.apply("kotlinx-atomicfu") - repositories { - mavenCentral() - jcenter() - maven("https://dl.bintray.com/kotlin/kotlin-eap") - maven("https://kotlin.bintray.com/kotlinx") - maven("https://dl.bintray.com/mipt-npm/dev") - } + repositories.applyRepos() configure { target { browser() } sourceSets["main"].apply { - languageSettings.apply { - progressiveMode = true - enableLanguageFeature("InlineClasses") - useExperimentalAnnotation("ExperimentalUnsignedType") - } + languageSettings.applySettings() dependencies { api(kotlin("stdlib-jdk8")) - if (extension.serialization) { - implementation("org.jetbrains.kotlinx:kotlinx-serialization-runtime:${Scientifik.serializationVersion}") - } - if (extension.atomicfu) { - implementation("org.jetbrains.kotlinx:atomicfu-js:${Scientifik.atomicfuVersion}") - } - if (extension.io) { - api("org.jetbrains.kotlinx:kotlinx-io-js:${Scientifik.ioVersion}") + afterEvaluate { + if (extension.serialization) { + implementation("org.jetbrains.kotlinx:kotlinx-serialization-runtime:${Scientifik.serializationVersion}") + } + if (extension.atomicfu) { + implementation("org.jetbrains.kotlinx:atomicfu-js:${Scientifik.atomicfuVersion}") + } + if (extension.io) { + api("org.jetbrains.kotlinx:kotlinx-io-js:${Scientifik.ioVersion}") + } } } } } + + tasks.apply { + val browserWebpack by getting(KotlinWebpack::class) { + afterEvaluate { + val destination = listOf(archiveBaseName, archiveAppendix, archiveVersion, archiveClassifier) + .filter { it != null && it.isNotBlank() } + .joinToString("-") + destinationDirectory = destinationDirectory?.resolve(destination) + } + archiveFileName = "main.bundle.js" + } + + afterEvaluate { + val installJsDist by creating(Copy::class) { + group = "distribution" + dependsOn(browserWebpack) + from(fileTree("src/main/web")) + into(browserWebpack.destinationDirectory!!) + } + + findByName("assemble")?.dependsOn(installJsDist) + + } + } } } diff --git a/src/main/kotlin/scientifik/ScientifikJVMPlugin.kt b/src/main/kotlin/scientifik/ScientifikJVMPlugin.kt index 63b04bd..3b4f1c2 100644 --- a/src/main/kotlin/scientifik/ScientifikJVMPlugin.kt +++ b/src/main/kotlin/scientifik/ScientifikJVMPlugin.kt @@ -3,7 +3,9 @@ package scientifik import Scientifik import org.gradle.api.Plugin import org.gradle.api.Project -import org.gradle.kotlin.dsl.* +import org.gradle.kotlin.dsl.configure +import org.gradle.kotlin.dsl.get +import org.gradle.kotlin.dsl.withType import org.jetbrains.kotlin.gradle.dsl.KotlinJvmProjectExtension import org.jetbrains.kotlin.gradle.tasks.KotlinCompile @@ -16,13 +18,7 @@ open class ScientifikJVMPlugin : Plugin { plugins.apply("kotlinx-serialization") plugins.apply("kotlinx-atomicfu") - repositories { - mavenCentral() - jcenter() - maven("https://dl.bintray.com/kotlin/kotlin-eap") - maven("https://kotlin.bintray.com/kotlinx") - maven("https://dl.bintray.com/mipt-npm/dev") - } + repositories.applyRepos() tasks.withType { kotlinOptions { @@ -32,22 +28,20 @@ open class ScientifikJVMPlugin : Plugin { configure { sourceSets["main"].apply { - languageSettings.apply { - progressiveMode = true - enableLanguageFeature("InlineClasses") - useExperimentalAnnotation("ExperimentalUnsignedType") - } + languageSettings.applySettings() dependencies { api(kotlin("stdlib-jdk8")) - if (extension.serialization) { - implementation("org.jetbrains.kotlinx:kotlinx-serialization-runtime:${Scientifik.serializationVersion}") - } - if (extension.atomicfu) { - implementation("org.jetbrains.kotlinx:atomicfu:${Scientifik.atomicfuVersion}") - } - if (extension.io) { - api("org.jetbrains.kotlinx:kotlinx-io-jvm:${Scientifik.ioVersion}") + afterEvaluate { + if (extension.serialization) { + implementation("org.jetbrains.kotlinx:kotlinx-serialization-runtime:${Scientifik.serializationVersion}") + } + if (extension.atomicfu) { + implementation("org.jetbrains.kotlinx:atomicfu:${Scientifik.atomicfuVersion}") + } + if (extension.io) { + api("org.jetbrains.kotlinx:kotlinx-io-jvm:${Scientifik.ioVersion}") + } } } } diff --git a/src/main/kotlin/scientifik/ScientifikMPPlugin.kt b/src/main/kotlin/scientifik/ScientifikMPPlugin.kt index 4abf98d..eb2145c 100644 --- a/src/main/kotlin/scientifik/ScientifikMPPlugin.kt +++ b/src/main/kotlin/scientifik/ScientifikMPPlugin.kt @@ -3,8 +3,10 @@ package scientifik import Scientifik import org.gradle.api.Plugin import org.gradle.api.Project +import org.gradle.api.tasks.Copy import org.gradle.kotlin.dsl.* import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension +import org.jetbrains.kotlin.gradle.targets.js.webpack.KotlinWebpack open class ScientifikMPPlugin : Plugin { override fun apply(project: Project) { @@ -14,13 +16,7 @@ open class ScientifikMPPlugin : Plugin { project.plugins.apply("kotlinx-serialization") project.plugins.apply("kotlinx-atomicfu") - project.repositories { - mavenCentral() - jcenter() - maven("https://dl.bintray.com/kotlin/kotlin-eap") - maven("https://kotlin.bintray.com/kotlinx") - maven("https://dl.bintray.com/mipt-npm/dev") - } + project.repositories.applyRepos() project.configure { jvm { @@ -35,10 +31,6 @@ open class ScientifikMPPlugin : Plugin { browser {} } - if (extension.native) { - linuxX64() - mingwX64() - } sourceSets.invoke { val commonMain by getting { @@ -100,32 +92,38 @@ open class ScientifikMPPlugin : Plugin { implementation(kotlin("test-js")) } } - - project.afterEvaluate { - if (extension.native) { - val native by creating { - dependsOn(commonMain) - } - mingwX64().compilations["main"].defaultSourceSet { - dependsOn(native) - } - linuxX64().compilations["main"].defaultSourceSet { - dependsOn(native) - } - } - } } targets.all { sourceSets.all { - languageSettings.apply { - progressiveMode = true - enableLanguageFeature("InlineClasses") - useExperimentalAnnotation("ExperimentalUnsignedType") - } + languageSettings.applySettings() } } } + project.tasks.apply { + val jsBrowserWebpack by getting(KotlinWebpack::class) { + archiveClassifier = "js" + project.afterEvaluate { + val destination = listOf(archiveBaseName, archiveAppendix, archiveVersion, archiveClassifier) + .filter { it != null && it.isNotBlank() } + .joinToString("-") + destinationDirectory = destinationDirectory?.resolve(destination) + } + archiveFileName = "main.bundle.js" + } + + project.afterEvaluate { + val installJsDist by creating(Copy::class) { + group = "distribution" + dependsOn(jsBrowserWebpack) + from(project.fileTree("src/jsMain/web")) + into(jsBrowserWebpack.destinationDirectory!!) + } + + findByName("assemble")?.dependsOn(installJsDist) + } + } + } } \ No newline at end of file diff --git a/src/main/kotlin/scientifik/ScientifikNativePlugin.kt b/src/main/kotlin/scientifik/ScientifikNativePlugin.kt new file mode 100644 index 0000000..d1fa4e1 --- /dev/null +++ b/src/main/kotlin/scientifik/ScientifikNativePlugin.kt @@ -0,0 +1,40 @@ +package scientifik + +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.kotlin.dsl.* +import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension + +class ScientifikNativePlugin : Plugin { + override fun apply(target: Project) { + target.pluginManager.withPlugin("org.jetbrains.kotlin.multiplatform") { + target.configure { + linuxX64() + mingwX64() + + sourceSets.apply { + val commonMain by getting {} + + val native by creating { + dependsOn(commonMain) + + dependencies { + //TODO add stdlib here + target.afterEvaluate { + //TODO add optional libraries here + } + } + } + + mingwX64().compilations["main"].defaultSourceSet { + dependsOn(native) + } + + linuxX64().compilations["main"].defaultSourceSet { + dependsOn(native) + } + } + } + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/scientifik/common.kt b/src/main/kotlin/scientifik/common.kt new file mode 100644 index 0000000..8f2ae90 --- /dev/null +++ b/src/main/kotlin/scientifik/common.kt @@ -0,0 +1,20 @@ +package scientifik + +import org.gradle.api.artifacts.dsl.RepositoryHandler +import org.gradle.kotlin.dsl.maven +import org.jetbrains.kotlin.gradle.plugin.LanguageSettingsBuilder + +internal fun LanguageSettingsBuilder.applySettings(): Unit { + progressiveMode = true + enableLanguageFeature("InlineClasses") + useExperimentalAnnotation("kotlin.ExperimentalUnsignedType") +} + +internal fun RepositoryHandler.applyRepos(): Unit{ + mavenCentral() + jcenter() + maven("https://dl.bintray.com/kotlin/kotlin-eap") + maven("https://kotlin.bintray.com/kotlinx") + maven("https://dl.bintray.com/mipt-npm/scientifik") + maven("https://dl.bintray.com/mipt-npm/dev") +} \ No newline at end of file