Versions.kt 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302
  1. /*
  2. * Copyright 2019-2023 Mamoe Technologies and contributors.
  3. *
  4. * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.
  5. * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.
  6. *
  7. * https://github.com/mamoe/mirai/blob/dev/LICENSE
  8. */
  9. @file:Suppress(
  10. "ObjectPropertyName", "ObjectPropertyName", "unused", "MemberVisibilityCanBePrivate", "RemoveRedundantBackticks"
  11. )
  12. import org.gradle.api.artifacts.ExternalModuleDependency
  13. import org.gradle.api.artifacts.ModuleDependency
  14. import org.gradle.api.attributes.Attribute
  15. import org.gradle.kotlin.dsl.exclude
  16. import org.jetbrains.kotlin.gradle.plugin.KotlinDependencyHandler
  17. // DO NOT CHANGE FILENAME OR RELATIVE PATH TO ROOT PROJECT.
  18. // mirai-deps-test DEPENDS ON THE PATH.
  19. object Versions {
  20. val project = System.getenv("mirai.build.project.version")?.takeIf { it.isNotBlank() }
  21. ?: System.getProperty("mirai.build.project.version")?.takeIf { it.isNotBlank() }
  22. ?: /*PROJECT_VERSION_START*/"2.15.0"/*PROJECT_VERSION_END*/
  23. // DO NOT ADD SPACE BETWEEN!
  24. val core get() = project
  25. val console get() = project
  26. val consoleIntellij get() = "231-$project-182-1" // idea-mirai-kotlin-patch
  27. val consoleTerminal get() = project
  28. const val kotlinCompiler = "1.8.10"
  29. const val kotlinStdlib = kotlinCompiler
  30. const val dokka = "1.8.10"
  31. const val kotlinCompilerForIdeaPlugin = "1.8.20-RC" // 231 bundles 1.8.20
  32. const val coroutines = "1.6.4"
  33. const val atomicFU = "0.20.0"
  34. const val serialization = "1.5.0"
  35. /**
  36. * 注意, 不要轻易升级 ktor 版本. 阅读 [RelocationNotes], 尤其是间接依赖部分.
  37. */
  38. const val ktor = "2.1.0"
  39. const val okhttp = "4.9.3" // 需要跟 Ktor 依赖的相同, 用于 shadow 后携带到 runtime
  40. const val okio = "3.2.0" // 需要跟 OkHttp 依赖的相同, 用于 shadow 后携带到 runtime
  41. const val binaryValidator = "0.4.0"
  42. const val blockingBridge = "3.0.0-180.1"
  43. const val dynamicDelegation = "0.4.0-180.1"
  44. const val mavenCentralPublish = "1.0.0"
  45. const val androidGradlePlugin = "4.1.1"
  46. const val android = "4.1.1.4"
  47. const val shadow = "8.1.0"
  48. const val logback = "1.3.4"
  49. const val slf4j = "2.0.3"
  50. const val log4j = "2.19.0"
  51. const val asm = "9.4"
  52. const val difflib = "1.3.0"
  53. const val netty = "4.1.63.Final"
  54. const val bouncycastle = "1.64"
  55. const val mavenArtifactResolver = "1.7.3"
  56. const val mavenResolverProvider = "3.8.4"
  57. const val junit = "5.7.2"
  58. const val yamlkt = "0.12.0"
  59. const val intellijGradlePlugin = "1.13.2"
  60. // https://github.com/google/jimfs
  61. // Java In Memory File System
  62. const val jimfs = "1.2"
  63. const val jline = "3.21.0"
  64. const val jansi = "2.4.0"
  65. // don't update easily unless you want your disk space -= 1000 MB
  66. // (700 MB for IDEA, 150 MB for sources, 150 MB for JBR)
  67. const val intellij = "2023.1"
  68. }
  69. @Suppress("unused")
  70. fun kotlinx(id: String, version: String) = "org.jetbrains.kotlinx:kotlinx-$id:$version"
  71. @Suppress("unused")
  72. fun ktor(id: String, version: String = Versions.ktor) = "io.ktor:ktor-$id:$version"
  73. val `kotlinx-coroutines-core` = kotlinx("coroutines-core", Versions.coroutines)
  74. val `kotlinx-coroutines-test` = kotlinx("coroutines-test", Versions.coroutines)
  75. val `kotlinx-coroutines-jdk8` = kotlinx("coroutines-jdk8", Versions.coroutines)
  76. val `kotlinx-coroutines-swing` = kotlinx("coroutines-swing", Versions.coroutines)
  77. val `kotlinx-coroutines-debug` = kotlinx("coroutines-debug", Versions.coroutines)
  78. val `kotlinx-serialization-core` = kotlinx("serialization-core", Versions.serialization)
  79. val `kotlinx-serialization-json` = kotlinx("serialization-json", Versions.serialization)
  80. val `kotlinx-serialization-protobuf` = kotlinx("serialization-protobuf", Versions.serialization)
  81. const val `kotlinx-atomicfu` = "org.jetbrains.kotlinx:atomicfu:${Versions.atomicFU}"
  82. const val `kotlin-jvm-blocking-bridge` = "me.him188:kotlin-jvm-blocking-bridge-runtime:${Versions.blockingBridge}"
  83. const val `kotlin-dynamic-delegation` = "me.him188:kotlin-dynamic-delegation:${Versions.dynamicDelegation}"
  84. /**
  85. * @see relocateImplementation
  86. */
  87. class RelocatedDependency(
  88. /**
  89. * Dependency notation, e.g. `io.ktor:ktor-io:2.1.0`
  90. */
  91. val notation: String,
  92. /**
  93. * Kotlin packages. e.g. `io.ktor`
  94. */
  95. vararg val packages: String,
  96. /**
  97. * Additional exclusions apart from everything from `org.jetbrains.kotlin` and `org.jetbrains.kotlinx`.
  98. */
  99. val exclusionAction: ExternalModuleDependency.() -> Unit = {},
  100. )
  101. fun KotlinDependencyHandler.implementationKotlinxIo(module: String) {
  102. implementation(module) {
  103. /*
  104. | +--- org.jetbrains.kotlinx:kotlinx-io-jvm:0.1.16
  105. | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.3.60 -> 1.5.30 (*)
  106. | | +--- org.jetbrains.kotlinx:atomicfu:0.14.1
  107. | | +--- org.jetbrains.kotlinx:atomicfu-common:0.14.1
  108. | | \--- org.jetbrains.kotlinx:kotlinx-io:0.1.16
  109. | | \--- org.jetbrains.kotlinx:atomicfu-common:0.14.1
  110. */
  111. exclude("org.jetbrains.kotlinx", "kotlinx-coroutines-core-common")
  112. exclude("org.jetbrains.kotlinx", "atomicfu")
  113. exclude("org.jetbrains.kotlinx", "atomicfu-common")
  114. }
  115. }
  116. class MultiplatformDependency private constructor(
  117. private val groupId: String,
  118. private val baseArtifactId: String,
  119. vararg val targets: String,
  120. ) {
  121. fun notations(): Sequence<Map<String, String>> {
  122. return sequenceOf(mapOf("group" to groupId, "module" to baseArtifactId))
  123. .plus(targets.asSequence().map { mapOf("group" to groupId, "module" to "$baseArtifactId.$it") })
  124. }
  125. companion object {
  126. fun jvm(groupId: String, baseArtifactId: String): MultiplatformDependency {
  127. return MultiplatformDependency(groupId, baseArtifactId, "common", "metadata", "jvm", "jdk8", "jdk7")
  128. }
  129. }
  130. }
  131. fun ModuleDependency.exclude(multiplatformDependency: MultiplatformDependency) {
  132. multiplatformDependency.notations().forEach {
  133. exclude(it)
  134. }
  135. }
  136. object ExcludeProperties {
  137. val `everything from kotlin` = exclude(groupId = "org.jetbrains.kotlin", null)
  138. val `everything from kotlinx` = exclude(groupId = "org.jetbrains.kotlinx", null)
  139. val `kotlin-stdlib` = multiplatformJvm(groupId = "org.jetbrains.kotlin", "kotlin-stdlib")
  140. val `kotlinx-coroutines` = multiplatformJvm(groupId = "org.jetbrains.kotlinx", "kotlinx-coroutines")
  141. val `ktor-io` = multiplatformJvm(groupId = "io.ktor", "ktor-io")
  142. val `everything from slf4j` = exclude(groupId = "org.slf4j", null)
  143. /**
  144. * @see org.gradle.kotlin.dsl.exclude
  145. */
  146. @OptIn(ExperimentalStdlibApi::class)
  147. private fun exclude(
  148. groupId: String?, artifactId: String?
  149. ): Map<String, String> = buildMap {
  150. groupId?.let { put("group", groupId) }
  151. artifactId?.let { put("module", artifactId) }
  152. }
  153. private fun multiplatformJvm(
  154. groupId: String, baseArtifactId: String
  155. ): MultiplatformDependency = MultiplatformDependency.jvm(groupId, baseArtifactId)
  156. }
  157. val `ktor-io` = ktor("io", Versions.ktor)
  158. val `ktor-io_relocated` = RelocatedDependency(`ktor-io`, "io.ktor.utils.io") {
  159. exclude(ExcludeProperties.`everything from slf4j`)
  160. }
  161. val `ktor-http` = ktor("http", Versions.ktor)
  162. val `ktor-events` = ktor("events", Versions.ktor)
  163. val `ktor-serialization` = ktor("serialization", Versions.ktor)
  164. val `ktor-websocket-serialization` = ktor("websocket-serialization", Versions.ktor)
  165. val `ktor-client-core` = ktor("client-core", Versions.ktor)
  166. val `ktor-client-core_relocated` = RelocatedDependency(`ktor-client-core`, "io.ktor") {
  167. exclude(ExcludeProperties.`ktor-io`)
  168. exclude(ExcludeProperties.`everything from slf4j`)
  169. }
  170. val `ktor-client-cio` = ktor("client-cio", Versions.ktor)
  171. val `ktor-client-mock` = ktor("client-mock", Versions.ktor)
  172. val `ktor-client-curl` = ktor("client-curl", Versions.ktor)
  173. val `ktor-client-darwin` = ktor("client-darwin", Versions.ktor)
  174. val `ktor-client-okhttp` = ktor("client-okhttp", Versions.ktor)
  175. val `ktor-client-okhttp_relocated` =
  176. RelocatedDependency(ktor("client-okhttp", Versions.ktor), "io.ktor", "okhttp", "okio") {
  177. exclude(ExcludeProperties.`ktor-io`)
  178. exclude(ExcludeProperties.`everything from slf4j`)
  179. }
  180. const val `okhttp3` = "com.squareup.okhttp3:okhttp:${Versions.okhttp}"
  181. const val `okio` = "com.squareup.okio:okio-jvm:${Versions.okio}"
  182. val `ktor-client-android` = ktor("client-android", Versions.ktor)
  183. val `ktor-client-logging` = ktor("client-logging", Versions.ktor)
  184. val `ktor-network` = ktor("network-jvm", Versions.ktor)
  185. val `ktor-client-serialization` = ktor("client-serialization", Versions.ktor)
  186. val `ktor-server-core` = ktor("server-core", Versions.ktor)
  187. val `ktor-server-netty` = ktor("server-netty", Versions.ktor)
  188. const val `java-in-memory-file-system` = "com.google.jimfs:jimfs:" + Versions.jimfs
  189. const val `logback-classic` = "ch.qos.logback:logback-classic:" + Versions.logback
  190. const val `slf4j-api` = "org.slf4j:slf4j-api:" + Versions.slf4j
  191. const val `slf4j-simple` = "org.slf4j:slf4j-simple:" + Versions.slf4j
  192. const val `log4j-api` = "org.apache.logging.log4j:log4j-api:" + Versions.log4j
  193. const val `log4j-core` = "org.apache.logging.log4j:log4j-core:" + Versions.log4j
  194. const val `log4j-slf4j2-impl` = "org.apache.logging.log4j:log4j-slf4j2-impl:" + Versions.log4j
  195. const val `log4j-to-slf4j` = "org.apache.logging.log4j:log4j-to-slf4j:" + Versions.log4j
  196. val ATTRIBUTE_MIRAI_TARGET_PLATFORM: Attribute<String> = Attribute.of("mirai.target.platform", String::class.java)
  197. const val `kotlin-compiler` = "org.jetbrains.kotlin:kotlin-compiler:${Versions.kotlinCompiler}"
  198. const val `kotlin-compiler_forIdea` = "org.jetbrains.kotlin:kotlin-compiler:${Versions.kotlinCompilerForIdeaPlugin}"
  199. const val `kotlin-stdlib` = "org.jetbrains.kotlin:kotlin-stdlib:${Versions.kotlinStdlib}"
  200. const val `kotlin-stdlib-jdk8` = "org.jetbrains.kotlin:kotlin-stdlib-jdk8:${Versions.kotlinStdlib}"
  201. const val `kotlin-reflect` = "org.jetbrains.kotlin:kotlin-reflect:${Versions.kotlinStdlib}"
  202. const val `kotlin-test` = "org.jetbrains.kotlin:kotlin-test:${Versions.kotlinStdlib}"
  203. const val `kotlin-test-junit5` = "org.jetbrains.kotlin:kotlin-test-junit5:${Versions.kotlinStdlib}"
  204. const val `junit-jupiter-api` = "org.junit.jupiter:junit-jupiter-api:${Versions.junit}"
  205. const val `junit-jupiter-params` = "org.junit.jupiter:junit-jupiter-params:${Versions.junit}"
  206. const val `junit-jupiter-engine` = "org.junit.jupiter:junit-jupiter-engine:${Versions.junit}"
  207. //const val `mirai-core-api` = "net.mamoe:mirai-core-api:${Versions.core}"
  208. //const val `mirai-core` = "net.mamoe:mirai-core:${Versions.core}"
  209. //const val `mirai-core-utils` = "net.mamoe:mirai-core-utils:${Versions.core}"
  210. const val `yamlkt` = "net.mamoe.yamlkt:yamlkt:${Versions.yamlkt}"
  211. const val `jetbrains-annotations` = "org.jetbrains:annotations:19.0.0"
  212. const val `caller-finder` = "io.github.karlatemp:caller:1.1.1"
  213. const val `android-runtime` = "com.google.android:android:${Versions.android}"
  214. const val `netty-all` = "io.netty:netty-all:${Versions.netty}"
  215. const val `netty-handler` = "io.netty:netty-handler:${Versions.netty}"
  216. const val `netty-common` = "io.netty:netty-common:${Versions.netty}"
  217. const val `netty-transport` = "io.netty:netty-transport:${Versions.netty}"
  218. const val `netty-buffer` = "io.netty:netty-buffer:${Versions.netty}"
  219. const val `bouncycastle` = "org.bouncycastle:bcprov-jdk15on:${Versions.bouncycastle}"
  220. const val `kt-bignum` = "com.ionspin.kotlin:bignum:0.3.7"
  221. val `kt-bignum_relocated` = RelocatedDependency(`kt-bignum`, "com.ionspin.kotlin.bignum")
  222. const val `maven-resolver-api` = "org.apache.maven.resolver:maven-resolver-api:${Versions.mavenArtifactResolver}"
  223. const val `maven-resolver-impl` = "org.apache.maven.resolver:maven-resolver-impl:${Versions.mavenArtifactResolver}"
  224. const val `maven-resolver-connector-basic` =
  225. "org.apache.maven.resolver:maven-resolver-connector-basic:${Versions.mavenArtifactResolver}"
  226. const val `maven-resolver-transport-http` =
  227. "org.apache.maven.resolver:maven-resolver-transport-http:${Versions.mavenArtifactResolver}"
  228. const val `maven-resolver-provider` = "org.apache.maven:maven-resolver-provider:${Versions.mavenResolverProvider}"
  229. const val jline = "org.jline:jline:${Versions.jline}"
  230. const val jansi = "org.fusesource.jansi:jansi:${Versions.jansi}"
  231. const val DEPS_TEST_VERSION = "2.99.0-deps-test"
  232. /**
  233. * This does not work for this build! Changes apply only in future builds.
  234. */
  235. fun setProjectVersionForFutureBuilds(newVersion: String) {
  236. rootProject.file("buildSrc/src/main/kotlin/Versions.kt").run {
  237. var text = readText()
  238. val template = { version: Any? -> "/*PROJECT_VERSION_START*/\"${version}\"/*PROJECT_VERSION_END*/" }
  239. check(text.indexOf(template(Versions.project)) != -1) { "Cannot find ${template(Versions.project)}" }
  240. text = text.replace(template(Versions.project), template(newVersion))
  241. writeText(text)
  242. }
  243. }