From ad3124fe1036084a08b4199e783db8dbc63a5a22 Mon Sep 17 00:00:00 2001 From: Him188 Date: Sat, 19 Sep 2020 20:33:34 +0800 Subject: [PATCH] Gradle plugin --- build.gradle.kts | 7 +- buildSrc/src/main/kotlin/Versions.kt | 2 +- tools/gradle-plugin/build.gradle.kts | 143 +++++++++++----- .../gradle/IGNORED_DEPENDENCIES_IN_SHADOW.kt | 132 +++++++++++++++ .../console/gradle/MiraiConsoleExtension.kt | 126 ++++++++++++++ .../gradle/MiraiConsoleGradlePlugin.kt | 156 ++++++++++++++++++ .../mirai/console/gradle/VersionConstants.kt | 15 ++ 7 files changed, 533 insertions(+), 48 deletions(-) create mode 100644 tools/gradle-plugin/src/main/kotlin/net/mamoe/mirai/console/gradle/IGNORED_DEPENDENCIES_IN_SHADOW.kt create mode 100644 tools/gradle-plugin/src/main/kotlin/net/mamoe/mirai/console/gradle/MiraiConsoleExtension.kt create mode 100644 tools/gradle-plugin/src/main/kotlin/net/mamoe/mirai/console/gradle/MiraiConsoleGradlePlugin.kt create mode 100644 tools/gradle-plugin/src/main/kotlin/net/mamoe/mirai/console/gradle/VersionConstants.kt diff --git a/build.gradle.kts b/build.gradle.kts index 4d51ad6de..ca24e980d 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,9 +1,12 @@ @file:Suppress("UnstableApiUsage") plugins { - id("com.jfrog.bintray") version Versions.bintray apply false - id("net.mamoe.kotlin-jvm-blocking-bridge") version Versions.blockingBridge apply false kotlin("jvm") version Versions.kotlinCompiler kotlin("plugin.serialization") version Versions.kotlinCompiler + id("com.jfrog.bintray") version Versions.bintray apply false + id("net.mamoe.kotlin-jvm-blocking-bridge") version Versions.blockingBridge apply false + id("com.gradle.plugin-publish") version "0.12.0" apply false + //id("com.bmuschko.nexus") version "2.3.1" apply false + //id("io.codearte.nexus-staging") version "0.11.0" apply false } tasks.withType(JavaCompile::class.java) { diff --git a/buildSrc/src/main/kotlin/Versions.kt b/buildSrc/src/main/kotlin/Versions.kt index 9aa94ebcd..ef3a362e1 100644 --- a/buildSrc/src/main/kotlin/Versions.kt +++ b/buildSrc/src/main/kotlin/Versions.kt @@ -9,7 +9,7 @@ object Versions { const val core = "1.3.0" - const val console = "1.0-RC-dev-5" + const val console = "1.0-RC-dev-28" const val consoleGraphical = "0.0.7" const val consoleTerminal = console diff --git a/tools/gradle-plugin/build.gradle.kts b/tools/gradle-plugin/build.gradle.kts index 741181c4b..88ec22487 100644 --- a/tools/gradle-plugin/build.gradle.kts +++ b/tools/gradle-plugin/build.gradle.kts @@ -2,14 +2,112 @@ plugins { kotlin("jvm") + kotlin("kapt") + id("java-gradle-plugin") + id("com.gradle.plugin-publish") id("java") + //signing `maven-publish` id("com.jfrog.bintray") + + id("com.github.johnrengelman.shadow") +} + +dependencies { + compileOnly(gradleApi()) + compileOnly(kotlin("gradle-plugin-api").toString()) { + exclude("org.jetbrains.kotlin", "kotlin-stdlib") + } + compileOnly(kotlin("gradle-plugin").toString()) { + exclude("org.jetbrains.kotlin", "kotlin-stdlib") + } + + compileOnly(kotlin("stdlib")) + + api("com.github.jengelman.gradle.plugins:shadow:6.0.0") + api("org.jetbrains:annotations:19.0.0") +} + +dependencies { + testApi(kotlin("test")) + testApi(kotlin("test-junit5")) + + testImplementation("org.junit.jupiter:junit-jupiter-api:5.2.0") + testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.2.0") } version = Versions.console description = "Gradle plugin for Mirai Console" +pluginBundle { + website = "https://github.com/mamoe/mirai-console" + vcsUrl = "https://github.com/mamoe/mirai-console" + tags = listOf("framework", "kotlin", "mirai") +} + +gradlePlugin { + plugins { + create("miraiConsole") { + id = "net.mamoe.mirai-console" + displayName = "Mirai Console" + description = project.description + implementationClass = "net.mamoe.mirai.console.gradle.MiraiConsoleGradlePlugin" + } + } +} + +kotlin { + sourceSets.all { + target.compilations.all { + kotlinOptions { + apiVersion = "1.3" + languageVersion = "1.3" + jvmTarget = "1.8" + freeCompilerArgs = freeCompilerArgs + "-Xjvm-default=all" + } + } + languageSettings.apply { + progressiveMode = true + + useExperimentalAnnotation("kotlin.RequiresOptIn") + useExperimentalAnnotation("kotlin.ExperimentalUnsignedTypes") + useExperimentalAnnotation("kotlin.experimental.ExperimentalTypeInference") + useExperimentalAnnotation("kotlin.contracts.ExperimentalContracts") + } + } +} + +tasks { + "test"(Test::class) { + useJUnitPlatform() + } + + val compileKotlin by getting {} + + @Suppress("UNUSED_VARIABLE") + val fillBuildConstants by registering { + group = "mirai" + doLast { + (compileKotlin as org.jetbrains.kotlin.gradle.tasks.KotlinCompile).source.filter { it.name == "VersionConstants.kt" }.single() + .let { file -> + file.writeText( + file.readText() + .replace( + Regex("""const val CONSOLE_VERSION = ".*"""") + ) { + """const val CONSOLE_VERSION = "${Versions.console}"""" + } + .replace( + Regex("""const val CORE_VERSION = ".*"""") + ) { """const val CORE_VERSION = "${Versions.core}"""" } + ) + } + } + } + + compileKotlin.dependsOn(fillBuildConstants) +} + java { sourceCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_1_8 @@ -19,49 +117,4 @@ tasks.withType(JavaCompile::class.java) { options.encoding = "UTF8" } -kotlin { - sourceSets.all { - target.compilations.all { - kotlinOptions { - jvmTarget = "1.8" - freeCompilerArgs = freeCompilerArgs + "-Xjvm-default=all" - //useIR = true - } - } - languageSettings.apply { - progressiveMode = true - - useExperimentalAnnotation("kotlin.Experimental") - useExperimentalAnnotation("kotlin.RequiresOptIn") - - useExperimentalAnnotation("net.mamoe.mirai.utils.MiraiInternalAPI") - useExperimentalAnnotation("net.mamoe.mirai.utils.MiraiExperimentalAPI") - useExperimentalAnnotation("net.mamoe.mirai.console.ConsoleFrontEndImplementation") - useExperimentalAnnotation("net.mamoe.mirai.console.util.ConsoleExperimentalApi") - useExperimentalAnnotation("kotlin.ExperimentalUnsignedTypes") - useExperimentalAnnotation("kotlin.experimental.ExperimentalTypeInference") - useExperimentalAnnotation("kotlin.contracts.ExperimentalContracts") - useExperimentalAnnotation("kotlinx.serialization.ExperimentalSerializationApi") - useExperimentalAnnotation("net.mamoe.mirai.console.util.ConsoleInternalApi") - } - } -} - -dependencies { - api("org.jetbrains:annotations:19.0.0") - api(kotlinx("coroutines-jdk8", Versions.coroutines)) - - testApi(kotlin("test")) - testApi(kotlin("test-junit5")) - - testImplementation("org.junit.jupiter:junit-jupiter-api:5.2.0") - testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.2.0") -} - -tasks { - "test"(Test::class) { - useJUnitPlatform() - } -} - // setupPublishing("mirai-console-gradle") \ No newline at end of file diff --git a/tools/gradle-plugin/src/main/kotlin/net/mamoe/mirai/console/gradle/IGNORED_DEPENDENCIES_IN_SHADOW.kt b/tools/gradle-plugin/src/main/kotlin/net/mamoe/mirai/console/gradle/IGNORED_DEPENDENCIES_IN_SHADOW.kt new file mode 100644 index 000000000..4b619f28f --- /dev/null +++ b/tools/gradle-plugin/src/main/kotlin/net/mamoe/mirai/console/gradle/IGNORED_DEPENDENCIES_IN_SHADOW.kt @@ -0,0 +1,132 @@ +/* + * Copyright 2020 Mamoe Technologies and contributors. + * + * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证. + * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link. + * + * https://github.com/mamoe/mirai/blob/master/LICENSE + */ + +@file:JvmMultifileClass +@file:JvmName("MiraiConsoleGradlePluginKt") + +package net.mamoe.mirai.console.gradle + +internal val IGNORED_DEPENDENCIES_IN_SHADOW = arrayOf( + "org.jetbrains.kotlin:kotlin-stdlib", + "org.jetbrains.kotlin:kotlin-stdlib-common", + "org.jetbrains.kotlin:kotlin-stdlib-metadata", + "org.jetbrains.kotlin:kotlin-stdlib-jvm", + "org.jetbrains.kotlin:kotlin-stdlib-jdk7", + "org.jetbrains.kotlin:kotlin-stdlib-jdk8", + + "org.jetbrains.kotlin:kotlin-reflect", + "org.jetbrains.kotlin:kotlin-reflect-common", + "org.jetbrains.kotlin:kotlin-reflect-metadata", + "org.jetbrains.kotlin:kotlin-reflect-jvm", + + "org.jetbrains.kotlinx:kotlinx-serialization-core", + "org.jetbrains.kotlinx:kotlinx-serialization-core-common", + "org.jetbrains.kotlinx:kotlinx-serialization-core-metadata", + "org.jetbrains.kotlinx:kotlinx-serialization-core-jvm", + + "org.jetbrains.kotlinx:kotlinx-serialization-runtime", + "org.jetbrains.kotlinx:kotlinx-serialization-runtime-common", + "org.jetbrains.kotlinx:kotlinx-serialization-runtime-metadata", + "org.jetbrains.kotlinx:kotlinx-serialization-runtime-jvm", + + "org.jetbrains.kotlinx:kotlinx-serialization-protobuf", + "org.jetbrains.kotlinx:kotlinx-serialization-protobuf-common", + "org.jetbrains.kotlinx:kotlinx-serialization-protobuf-metadata", + "org.jetbrains.kotlinx:kotlinx-serialization-protobuf-jvm", + + "org.jetbrains.kotlinx:kotlinx-coroutines-core", + "org.jetbrains.kotlinx:kotlinx-coroutines-core-common", + "org.jetbrains.kotlinx:kotlinx-coroutines-core-metadata", + "org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm", + + "org.jetbrains.kotlinx:kotlinx-io", + "org.jetbrains.kotlinx:kotlinx-io-common", + "org.jetbrains.kotlinx:kotlinx-io-metadata", + "org.jetbrains.kotlinx:kotlinx-io-jvm", + + "org.jetbrains.kotlinx:kotlinx-coroutines-io", + "org.jetbrains.kotlinx:kotlinx-coroutines-io-common", + "org.jetbrains.kotlinx:kotlinx-coroutines-io-metadata", + "org.jetbrains.kotlinx:kotlinx-coroutines-io-jvm", + + "org.jetbrains.kotlinx:kotlinx-coroutines-core-jdk7", + "org.jetbrains.kotlinx:kotlinx-coroutines-core-jdk8", + + "org.jetbrains.kotlinx:kotlinx-coroutines-jdk7", + "org.jetbrains.kotlinx:kotlinx-coroutines-jdk8", + + "org.jetbrains.kotlinx:atomicFu", + "org.jetbrains.kotlinx:atomicFu-common", + "org.jetbrains.kotlinx:atomicFu-metadata", + "org.jetbrains.kotlinx:atomicFu-jvm", + + "org.jetbrains:annotations:19.0.0", + + "io.ktor:ktor-client", + "io.ktor:ktor-client-common", + "io.ktor:ktor-client-metadata", + "io.ktor:ktor-client-jvm", + + "io.ktor:ktor-client-cio", + "io.ktor:ktor-client-cio-common", + "io.ktor:ktor-client-cio-metadata", + "io.ktor:ktor-client-cio-jvm", + + "io.ktor:ktor-client-core", + "io.ktor:ktor-client-core-common", + "io.ktor:ktor-client-core-metadata", + "io.ktor:ktor-client-core-jvm", + + "io.ktor:ktor-client-network", + "io.ktor:ktor-client-network-common", + "io.ktor:ktor-client-network-metadata", + "io.ktor:ktor-client-network-jvm", + + "io.ktor:ktor-client-util", + "io.ktor:ktor-client-util-common", + "io.ktor:ktor-client-util-metadata", + "io.ktor:ktor-client-util-jvm", + + "io.ktor:ktor-client-http", + "io.ktor:ktor-client-http-common", + "io.ktor:ktor-client-http-metadata", + "io.ktor:ktor-client-http-jvm", + + "org.bouncyCastle:bcProv-jdk15on", + + "net.mamoe:mirai-core", + "net.mamoe:mirai-core-metadata", + "net.mamoe:mirai-core-common", + "net.mamoe:mirai-core-jvm", + + "net.mamoe:mirai-core-api", // for future + "net.mamoe:mirai-core-api-metadata", + "net.mamoe:mirai-core-api-common", + "net.mamoe:mirai-core-api-jvm", + + "net.mamoe:mirai-core-qqAndroid", + "net.mamoe:mirai-core-qqAndroid-metadata", + "net.mamoe:mirai-core-qqAndroid-common", + "net.mamoe:mirai-core-qqAndroid-jvm", + + "net.mamoe:mirai-console", + "net.mamoe:mirai-console-api", // for future + "net.mamoe:mirai-console-terminal", + "net.mamoe:mirai-console-graphical", + + "net.mamoe.yamlKt:yamlKt", + "net.mamoe.yamlKt:yamlKt-common", + "net.mamoe.yamlKt:yamlKt-metadata", + "net.mamoe.yamlKt:yamlKt-jvm", + + "net.mamoe:kotlin-jvm-blocking-bridge", + "net.mamoe:kotlin-jvm-blocking-bridge-common", + "net.mamoe:kotlin-jvm-blocking-bridge-metadata", + "net.mamoe:kotlin-jvm-blocking-bridge-jvm" +).map { it.toLowerCase() }.map { MiraiConsoleExtension.ExcludedDependency(it.substringBefore(':'), it.substringAfterLast(':')) }.toTypedArray() \ No newline at end of file diff --git a/tools/gradle-plugin/src/main/kotlin/net/mamoe/mirai/console/gradle/MiraiConsoleExtension.kt b/tools/gradle-plugin/src/main/kotlin/net/mamoe/mirai/console/gradle/MiraiConsoleExtension.kt new file mode 100644 index 000000000..74dc3043a --- /dev/null +++ b/tools/gradle-plugin/src/main/kotlin/net/mamoe/mirai/console/gradle/MiraiConsoleExtension.kt @@ -0,0 +1,126 @@ +/* + * Copyright 2020 Mamoe Technologies and contributors. + * + * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证. + * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link. + * + * https://github.com/mamoe/mirai/blob/master/LICENSE + */ + +@file:Suppress("unused", "MemberVisibilityCanBePrivate") + +package net.mamoe.mirai.console.gradle + +import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar +import org.gradle.api.JavaVersion + +/** + * ``` + * mirai { + * // 配置 + * } + * ``` + */ +// must be open +open class MiraiConsoleExtension { + /** + * 为 `true` 时不自动添加 mirai-core 的依赖 + * + * 默认: `false` + */ + var noCore: Boolean = false + + /** + * 为 `true` 时不自动为 test 模块添加 mirai-core-qqandroid 的依赖. + * + * 默认: `false` + */ + var noTestCoreQQAndroid: Boolean = false + + /** + * 为 `true` 时不自动添加 mirai-console 的依赖. + * + * 默认: `false` + */ + var noConsole: Boolean = false + + /** + * 自动添加的 mirai-core 和 mirai-core-qqandroid 的版本. + * + * 默认: 与本 Gradle 插件编译时的 mirai-core 版本相同. [VersionConstants.CORE_VERSION] + */ + var coreVersion: String = VersionConstants.CORE_VERSION + + /** + * 自动添加的 mirai-console 后端和前端的版本. + * + * 默认: 与本 Gradle 插件版本相同. [VersionConstants.CONSOLE_VERSION] + */ + var consoleVersion: String = VersionConstants.CONSOLE_VERSION + + /** + * 自动为 test 模块添加的前端依赖名称 + * + * 为 `null` 时不自动为 test 模块添加前端依赖. + * + * 默认: [MiraiConsoleFrontEndKind.TERMINAL] + */ + var useTestConsoleFrontEnd: MiraiConsoleFrontEndKind? = MiraiConsoleFrontEndKind.TERMINAL + + /** + * Java 和 Kotlin 编译目标. 至少为 [JavaVersion.VERSION_1_8]. + * + * 一般人不需要修改此项. + * + * 默认: [JavaVersion.VERSION_1_8] + */ + var jvmTarget: JavaVersion = JavaVersion.VERSION_1_8 + + /** + * 默认会配置 Kotlin 编译器参数 "-Xjvm-default=all". 将此项设置为 `false` 可避免配置. + * + * 一般人不需要修改此项. + * + * 默认: `false` + */ + var dontConfigureKotlinJvmDefault: Boolean = false + + internal val shadowConfigurations: MutableList Unit> = mutableListOf() + internal val excludedDependencies: MutableSet = mutableSetOf() + + internal data class ExcludedDependency( + val group: String, + val name: String + ) + + /** + * 配置 [ShadowJar] (即打包插件) + */ + fun configureShadow(configure: ShadowJar.() -> Unit) { + shadowConfigurations.add(configure) + } + + /** + * 在插件打包时忽略一个依赖 + * + * @param notation 格式为 "groupId:name". 如 "org.jetbrains.kotlin:kotlin-stdlib" + */ + fun excludeDependency(notation: String) { + requireNotNull(notation.count { it == ':' } == 1) { "Invalid dependency notation $notation." } + excludedDependencies.add(ExcludedDependency(notation.substringBefore(':'), notation.substringAfter(':'))) + } + + /** + * 在插件打包时忽略一个依赖 + * + * @param group 如 "org.jetbrains.kotlin" + * @param name 如 "kotlin-stdlib" + */ + fun excludeDependency(group: String, name: String) { + excludedDependencies.add(ExcludedDependency(group, name)) + } +} + +enum class MiraiConsoleFrontEndKind { + TERMINAL, +} \ No newline at end of file diff --git a/tools/gradle-plugin/src/main/kotlin/net/mamoe/mirai/console/gradle/MiraiConsoleGradlePlugin.kt b/tools/gradle-plugin/src/main/kotlin/net/mamoe/mirai/console/gradle/MiraiConsoleGradlePlugin.kt new file mode 100644 index 000000000..051502390 --- /dev/null +++ b/tools/gradle-plugin/src/main/kotlin/net/mamoe/mirai/console/gradle/MiraiConsoleGradlePlugin.kt @@ -0,0 +1,156 @@ +/* + * Copyright 2020 Mamoe Technologies and contributors. + * + * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证. + * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link. + * + * https://github.com/mamoe/mirai/blob/master/LICENSE + */ + +@file:JvmMultifileClass +@file:JvmName("MiraiConsoleGradlePluginKt") + +package net.mamoe.mirai.console.gradle + +import com.github.jengelman.gradle.plugins.shadow.ShadowPlugin +import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.api.plugins.JavaPlugin +import org.gradle.api.plugins.JavaPluginExtension +import org.gradle.api.tasks.compile.JavaCompile +import org.jetbrains.kotlin.gradle.dsl.KotlinJvmOptions +import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension +import org.jetbrains.kotlin.gradle.dsl.KotlinProjectExtension +import org.jetbrains.kotlin.gradle.dsl.KotlinSingleTargetExtension +import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation.Companion.MAIN_COMPILATION_NAME +import org.jetbrains.kotlin.gradle.plugin.KotlinDependencyHandler +import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet +import org.jetbrains.kotlin.gradle.plugin.KotlinTarget + +class MiraiConsoleGradlePlugin : Plugin { + companion object { + internal const val BINTRAY_REPOSITORY_URL = "https://dl.bintray.com/him188moe/mirai" + } + + private fun KotlinSourceSet.configureSourceSet(project: Project) { + languageSettings.useExperimentalAnnotation("kotlin.RequiresOptIn") + dependencies { configureDependencies(project, this@configureSourceSet) } + } + + private fun Project.configureTarget(target: KotlinTarget) { + val miraiExtension = project.miraiExtension + + for (compilation in target.compilations) with(compilation) { + kotlinOptions { + if (this !is KotlinJvmOptions) return@kotlinOptions + jvmTarget = miraiExtension.jvmTarget.toString() + if (!miraiExtension.dontConfigureKotlinJvmDefault) freeCompilerArgs = freeCompilerArgs + "-Xjvm-default=all" + } + } + target.compilations.flatMap { it.allKotlinSourceSets }.forEach { sourceSet -> + sourceSet.configureSourceSet(project) + } + } + + @Suppress("SpellCheckingInspection") + private fun KotlinDependencyHandler.configureDependencies(project: Project, sourceSet: KotlinSourceSet) { + val miraiExtension = project.miraiExtension + + if (!miraiExtension.noCore) compileOnly("net.mamoe:mirai-core:${miraiExtension.coreVersion}") + if (!miraiExtension.noConsole) compileOnly("net.mamoe:mirai-console:${miraiExtension.consoleVersion}") + + if (sourceSet.name.endsWith("test", ignoreCase = true)) { + if (!miraiExtension.noCore) api("net.mamoe:mirai-core:${miraiExtension.coreVersion}") + if (!miraiExtension.noConsole) api("net.mamoe:mirai-console:${miraiExtension.consoleVersion}") + if (!miraiExtension.noTestCoreQQAndroid) api("net.mamoe:mirai-core-qqandroid:${miraiExtension.coreVersion}") + when (miraiExtension.useTestConsoleFrontEnd) { + MiraiConsoleFrontEndKind.TERMINAL -> api("net.mamoe:mirai-console-terminal:${miraiExtension.consoleVersion}") + } + } + } + + private fun Project.configureCompileTarget() { + extensions.findByType(JavaPluginExtension::class.java)?.apply { + val miraiExtension = miraiExtension + sourceCompatibility = miraiExtension.jvmTarget + targetCompatibility = miraiExtension.jvmTarget + } + + tasks.withType(JavaCompile::class.java) { + it.options.encoding = "UTF8" + } + } + + private fun Project.registerBuildPluginTasks() { + val miraiExtension = this.miraiExtension + + tasks.findByName("shadowJar")?.enabled = false + + fun registerBuildPluginTask(target: KotlinTarget, isSinglePlatform: Boolean) { + tasks.create(if (isSinglePlatform) "buildPlugin" else "buildPlugin${target.name.capitalize()}", ShadowJar::class.java).apply shadow@{ + group = "mirai" + + val compilations = target.compilations.filter { it.name == MAIN_COMPILATION_NAME } + + compilations.forEach { + dependsOn(it.compileKotlinTask) + from(it.output) + } + + from(project.configurations.getByName("runtimeClasspath").copyRecursive { dependency -> + for (excludedDependency in IGNORED_DEPENDENCIES_IN_SHADOW + miraiExtension.excludedDependencies) { + if (excludedDependency.group == dependency.group + && excludedDependency.name == dependency.name + ) return@copyRecursive false + } + true + }) + + exclude { file -> + file.name.endsWith(".sf", ignoreCase = true) + } + + destinationDirectory.value(project.layout.projectDirectory.dir(project.buildDir.name).dir("mirai")) + + miraiExtension.shadowConfigurations.forEach { it.invoke(this@shadow) } + } + } + + val targets = kotlinTargets + val isSingleTarget = targets.size == 1 + targets.forEach { target -> + registerBuildPluginTask(target, isSingleTarget) + } + } + + override fun apply(target: Project): Unit = with(target) { + target.extensions.create("mirai", MiraiConsoleExtension::class.java) + + target.plugins.apply(JavaPlugin::class.java) + target.plugins.apply(ShadowPlugin::class.java) + + target.repositories.maven { it.setUrl(BINTRAY_REPOSITORY_URL) } + + afterEvaluate { + configureCompileTarget() + registerBuildPluginTasks() + kotlinTargets.forEach { configureTarget(it) } + } + } +} + +internal val Project.miraiExtension: MiraiConsoleExtension + get() = extensions.findByType(MiraiConsoleExtension::class.java) ?: error("Cannot find MiraiConsoleExtension in project ${this.name}") + +internal val Project.kotlinTargets: Collection + get() { + val kotlinExtension = extensions.findByType(KotlinProjectExtension::class.java) + ?: error("Kotlin plugin not applied. Please read https://www.kotlincn.net/docs/reference/using-gradle.html") + + return when (kotlinExtension) { + is KotlinMultiplatformExtension -> kotlinExtension.targets + is KotlinSingleTargetExtension -> listOf(kotlinExtension.target) + else -> error("[MiraiConsole] Internal error: kotlinExtension is neither KotlinMultiplatformExtension nor KotlinSingleTargetExtension") + } + } \ No newline at end of file diff --git a/tools/gradle-plugin/src/main/kotlin/net/mamoe/mirai/console/gradle/VersionConstants.kt b/tools/gradle-plugin/src/main/kotlin/net/mamoe/mirai/console/gradle/VersionConstants.kt new file mode 100644 index 000000000..2db0c82e2 --- /dev/null +++ b/tools/gradle-plugin/src/main/kotlin/net/mamoe/mirai/console/gradle/VersionConstants.kt @@ -0,0 +1,15 @@ +/* + * Copyright 2020 Mamoe Technologies and contributors. + * + * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证. + * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link. + * + * https://github.com/mamoe/mirai/blob/master/LICENSE + */ + +package net.mamoe.mirai.console.gradle + +internal object VersionConstants { + const val CONSOLE_VERSION = "1.0-RC-dev-28" // value is written here automatically during build + const val CORE_VERSION = "1.3.0" // value is written here automatically during build +} \ No newline at end of file