mirror of
https://github.com/mamoe/mirai.git
synced 2025-03-22 05:10:09 +08:00
Fix nested projects building; Fix #2038
This commit is contained in:
parent
92a5babf1c
commit
97a37a196f
@ -17,25 +17,42 @@ import java.io.File
|
||||
import java.util.zip.ZipFile
|
||||
import kotlin.test.assertFalse
|
||||
import kotlin.test.assertNotNull
|
||||
import kotlin.test.assertNull
|
||||
import kotlin.test.assertTrue
|
||||
|
||||
class TestBuildPlugin : AbstractTest() {
|
||||
private fun File.wt(text: String) {
|
||||
parentFile?.mkdirs()
|
||||
writeText(text)
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("project as normal dependency")
|
||||
fun buildWithMultiProjectsAsNormalDependency() {
|
||||
settingsFile.appendText(
|
||||
"""
|
||||
include("nested")
|
||||
include("nested1")
|
||||
include("nested0")
|
||||
""".trimIndent()
|
||||
)
|
||||
tempDir.resolve("nested").also { it.mkdirs() }.resolve("build.gradle").writeText(
|
||||
tempDir.resolve("nested1/build.gradle").wt(
|
||||
"""
|
||||
plugins {
|
||||
id("org.jetbrains.kotlin.jvm")
|
||||
}
|
||||
repositories {
|
||||
mavenCentral()
|
||||
}
|
||||
""".trimIndent()
|
||||
)
|
||||
tempDir.resolve("nested0/build.gradle").wt(
|
||||
"""
|
||||
plugins {
|
||||
id("org.jetbrains.kotlin.jvm")
|
||||
id("net.mamoe.mirai-console")
|
||||
}
|
||||
dependencies {
|
||||
api project(":nested1")
|
||||
api "com.zaxxer:SparseBitSet:1.2"
|
||||
}
|
||||
repositories {
|
||||
@ -47,11 +64,29 @@ class TestBuildPlugin : AbstractTest() {
|
||||
tempDir.resolve("build.gradle").appendText(
|
||||
"""
|
||||
dependencies {
|
||||
implementation project(":nested")
|
||||
asNormalDep project(":nested")
|
||||
implementation project(":nested0")
|
||||
asNormalDep project(":nested0")
|
||||
}
|
||||
""".trimIndent()
|
||||
)
|
||||
tempDir.resolve("nested0/src/main/kotlin/test.kt").wt(
|
||||
"""
|
||||
package nested
|
||||
public class TestClass
|
||||
""".trimIndent()
|
||||
)
|
||||
tempDir.resolve("nested1/src/main/kotlin/test.kt").wt(
|
||||
"""
|
||||
package nested1
|
||||
public class TestClass
|
||||
""".trimIndent()
|
||||
)
|
||||
tempDir.resolve("src/main/kotlin/test.kt").wt(
|
||||
"""
|
||||
package thetop
|
||||
public class TestClass
|
||||
""".trimIndent()
|
||||
)
|
||||
|
||||
gradleRunner()
|
||||
.withArguments(":buildPlugin", "--stacktrace", "--info")
|
||||
@ -69,7 +104,97 @@ class TestBuildPlugin : AbstractTest() {
|
||||
|
||||
assertFalse { dpShared.contains("com.zaxxer:SparseBitSet:1.2") }
|
||||
assertTrue { dpPrivate.contains("com.zaxxer:SparseBitSet:1.2") }
|
||||
assertTrue { dpPrivate.contains(":nested") }
|
||||
assertTrue { dpPrivate.contains(":nested0") }
|
||||
assertTrue { dpPrivate.contains(":nested1") }
|
||||
assertNotNull(zipFile.getEntry("thetop/TestClass.class"))
|
||||
assertNull(zipFile.getEntry("nested/TestClass.class"))
|
||||
assertNull(zipFile.getEntry("nested1/TestClass.class"))
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("project as normal dependency 2")
|
||||
fun buildWithMultiProjectsAsNormalDependency2() {
|
||||
settingsFile.appendText(
|
||||
"""
|
||||
include("nested1")
|
||||
include("nested0")
|
||||
""".trimIndent()
|
||||
)
|
||||
tempDir.resolve("nested1/build.gradle").wt(
|
||||
"""
|
||||
plugins {
|
||||
id("org.jetbrains.kotlin.jvm")
|
||||
}
|
||||
repositories {
|
||||
mavenCentral()
|
||||
}
|
||||
""".trimIndent()
|
||||
)
|
||||
tempDir.resolve("nested0/build.gradle").wt(
|
||||
"""
|
||||
plugins {
|
||||
id("org.jetbrains.kotlin.jvm")
|
||||
id("net.mamoe.mirai-console")
|
||||
}
|
||||
dependencies {
|
||||
api project(":nested1")
|
||||
api "com.zaxxer:SparseBitSet:1.2"
|
||||
}
|
||||
repositories {
|
||||
mavenCentral()
|
||||
}
|
||||
""".trimIndent()
|
||||
)
|
||||
|
||||
tempDir.resolve("build.gradle").appendText(
|
||||
"""
|
||||
dependencies {
|
||||
implementation project(":nested0")
|
||||
asNormalDep project(":nested1")
|
||||
}
|
||||
""".trimIndent()
|
||||
)
|
||||
tempDir.resolve("nested0/src/main/kotlin/test.kt").wt(
|
||||
"""
|
||||
package nested
|
||||
public class TestClass
|
||||
""".trimIndent()
|
||||
)
|
||||
tempDir.resolve("nested1/src/main/kotlin/test.kt").wt(
|
||||
"""
|
||||
package nested1
|
||||
public class TestClass
|
||||
""".trimIndent()
|
||||
)
|
||||
tempDir.resolve("src/main/kotlin/test.kt").wt(
|
||||
"""
|
||||
package thetop
|
||||
public class TestClass
|
||||
""".trimIndent()
|
||||
)
|
||||
|
||||
gradleRunner()
|
||||
.withArguments(":buildPlugin", "--stacktrace", "--info")
|
||||
.build()
|
||||
|
||||
|
||||
ZipFile(findJar()).use { zipFile ->
|
||||
|
||||
val dpPrivate = zipFile.getInputStream(
|
||||
zipFile.getEntry("META-INF/mirai-console-plugin/dependencies-private.txt")
|
||||
).use { it.readBytes().decodeToString() }
|
||||
val dpShared = zipFile.getInputStream(
|
||||
zipFile.getEntry("META-INF/mirai-console-plugin/dependencies-shared.txt")
|
||||
).use { it.readBytes().decodeToString() }
|
||||
|
||||
assertFalse { dpShared.contains("com.zaxxer:SparseBitSet:1.2") }
|
||||
assertTrue { dpPrivate.contains("com.zaxxer:SparseBitSet:1.2") }
|
||||
assertFalse { dpPrivate.contains(":nested0") }
|
||||
assertTrue { dpPrivate.contains(":nested1") }
|
||||
assertNotNull(zipFile.getEntry("thetop/TestClass.class"))
|
||||
assertNotNull(zipFile.getEntry("nested/TestClass.class"))
|
||||
assertNull(zipFile.getEntry("nested1/TestClass.class"))
|
||||
}
|
||||
}
|
||||
|
||||
@ -81,7 +206,7 @@ class TestBuildPlugin : AbstractTest() {
|
||||
include("nested")
|
||||
""".trimIndent()
|
||||
)
|
||||
tempDir.resolve("nested").also { it.mkdirs() }.resolve("build.gradle").writeText(
|
||||
tempDir.resolve("nested/build.gradle").wt(
|
||||
"""
|
||||
plugins {
|
||||
id("org.jetbrains.kotlin.jvm")
|
||||
@ -104,6 +229,19 @@ class TestBuildPlugin : AbstractTest() {
|
||||
""".trimIndent()
|
||||
)
|
||||
|
||||
tempDir.resolve("nested/src/main/kotlin/test.kt").wt(
|
||||
"""
|
||||
package nested
|
||||
public class TestClass
|
||||
""".trimIndent()
|
||||
)
|
||||
tempDir.resolve("src/main/kotlin/test.kt").wt(
|
||||
"""
|
||||
package thetop
|
||||
public class TestClass
|
||||
""".trimIndent()
|
||||
)
|
||||
|
||||
gradleRunner()
|
||||
.withArguments(":buildPlugin", "--stacktrace", "--info")
|
||||
.build()
|
||||
@ -120,6 +258,9 @@ class TestBuildPlugin : AbstractTest() {
|
||||
|
||||
assertFalse { dpShared.contains("com.zaxxer:SparseBitSet:1.2") }
|
||||
assertTrue { dpPrivate.contains("com.zaxxer:SparseBitSet:1.2") }
|
||||
|
||||
assertNotNull(zipFile.getEntry("thetop/TestClass.class"))
|
||||
assertNotNull(zipFile.getEntry("nested/TestClass.class"))
|
||||
}
|
||||
}
|
||||
|
||||
@ -131,7 +272,7 @@ class TestBuildPlugin : AbstractTest() {
|
||||
include("nested")
|
||||
""".trimIndent()
|
||||
)
|
||||
tempDir.resolve("nested").also { it.mkdirs() }.resolve("build.gradle").writeText(
|
||||
tempDir.resolve("nested/build.gradle").wt(
|
||||
"""
|
||||
plugins {
|
||||
id("org.jetbrains.kotlin.jvm")
|
||||
@ -157,10 +298,28 @@ class TestBuildPlugin : AbstractTest() {
|
||||
""".trimIndent()
|
||||
)
|
||||
|
||||
tempDir.resolve("nested/src/main/kotlin/test.kt").wt(
|
||||
"""
|
||||
package nested
|
||||
public class TestClass
|
||||
""".trimIndent()
|
||||
)
|
||||
tempDir.resolve("src/main/kotlin/test.kt").wt(
|
||||
"""
|
||||
package thetop
|
||||
public class TestClass
|
||||
""".trimIndent()
|
||||
)
|
||||
|
||||
gradleRunner()
|
||||
.withArguments(":buildPlugin", "dependencies", "--stacktrace", "--info")
|
||||
.build()
|
||||
checkOutput()
|
||||
|
||||
ZipFile(findJar()).use { zipFile ->
|
||||
assertNotNull(zipFile.getEntry("thetop/TestClass.class"))
|
||||
assertNotNull(zipFile.getEntry("nested/TestClass.class"))
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -73,6 +73,8 @@ public open class BuildMiraiPluginV2 : Jar() {
|
||||
val shadowedDependencies = mutableSetOf<String>()
|
||||
val subprojects = mutableSetOf<String>()
|
||||
val subprojects_fullpath = mutableSetOf<String>()
|
||||
// val subprojects_unlinked_fullpath = mutableSetOf<String>()
|
||||
val subprojects_linked_fullpath = mutableSetOf<String>()
|
||||
|
||||
project.configurations.findByName(MiraiConsoleGradlePlugin.MIRAI_SHADOW_CONF_NAME)?.allDependencies?.forEach { dep ->
|
||||
if (dep is ExternalModuleDependency) {
|
||||
@ -80,10 +82,16 @@ public open class BuildMiraiPluginV2 : Jar() {
|
||||
shadowedDependencies.add(artId)
|
||||
}
|
||||
}
|
||||
project.configurations.findByName(MiraiConsoleGradlePlugin.MIRAI_AS_NORMAL_DEP_CONF_NAME)?.allDependencies?.forEach { dep ->
|
||||
if (dep is ProjectDependency) {
|
||||
linkedDependencies.add("${dep.group}:${dep.name}")
|
||||
project.configurations.findByName(MiraiConsoleGradlePlugin.MIRAI_AS_NORMAL_DEP_CONF_NAME)?.allDependencies?.forEach { dep1 ->
|
||||
fun resolve0(dep: Dependency) {
|
||||
if (dep is ProjectDependency) {
|
||||
linkedDependencies.add("${dep.group}:${dep.name}")
|
||||
subprojects_linked_fullpath.add(dep.dependencyProject.path)
|
||||
dep.dependencyProject.configurations.findByName("apiElements")?.allDependencies?.forEach { resolve0(it) }
|
||||
dep.dependencyProject.configurations.findByName("implementation")?.allDependencies?.forEach { resolve0(it) }
|
||||
}
|
||||
}
|
||||
resolve0(dep1)
|
||||
}
|
||||
|
||||
fun deepForeachDependencies(conf: Configuration?, action: (Dependency) -> Unit) {
|
||||
@ -168,11 +176,20 @@ public open class BuildMiraiPluginV2 : Jar() {
|
||||
}
|
||||
runtimeClasspath.firstLevelModuleDependencies.forEach { resolveDependency(it) }
|
||||
|
||||
/*subprojects_fullpath.forEach { usedProject ->
|
||||
val subProj = project.project(usedProject)
|
||||
if ("${subProj.group}:${subProj.name}" !in linkedDependencies) {
|
||||
subprojects_unlinked_fullpath.add(usedProject)
|
||||
}
|
||||
}*/
|
||||
|
||||
logger.info { "linkedDependencies: $linkedDependencies" }
|
||||
logger.info { "linkToAPi : $linkToApi" }
|
||||
logger.info { "api : $api" }
|
||||
logger.info { "runtime : $runtime" }
|
||||
logger.info { "subprojects : $subprojects" }
|
||||
logger.info { "subprojects_linked: $subprojects_linked_fullpath" }
|
||||
// logger.info { "subprojects_unlink: $subprojects_unlinked_fullpath" }
|
||||
|
||||
val lenientConfiguration = runtimeClasspath.lenientConfiguration
|
||||
if (lenientConfiguration is DefaultLenientConfiguration) {
|
||||
@ -207,7 +224,7 @@ public open class BuildMiraiPluginV2 : Jar() {
|
||||
}
|
||||
val cid = artId.componentIdentifier
|
||||
if (cid is ProjectComponentIdentifier) {
|
||||
if (cid.projectPath in subprojects_fullpath) {
|
||||
if (cid.projectPath in subprojects_linked_fullpath) {
|
||||
return@forEach
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user