Skip to content

Commit fbb1dd9

Browse files
committed
Support multi remote servers; Support maven local & gradle local
1 parent aa44032 commit fbb1dd9

File tree

4 files changed

+104
-6
lines changed

4 files changed

+104
-6
lines changed

mirai-console/backend/integration-test/test/testpoints/PluginSharedLibraries.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ internal object PluginSharedLibraries : AbstractTestPoint() {
2121
if (System.getenv("CI").orEmpty().toBoolean()) {
2222
println("CI env")
2323
File("config/Console/PluginDependencies.yml").writeText(
24-
"repoLoc: 'https://repo.maven.apache.org/maven2'"
24+
"repoLoc: ['https://repo.maven.apache.org/maven2']"
2525
)
2626
}
2727
File("plugin-shared-libraries").mkdirs()

mirai-console/backend/mirai-console/src/internal/data/builtins/PluginDependenciesConfig.kt

+2-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ import net.mamoe.mirai.console.data.ReadOnlyPluginConfig
1313
import net.mamoe.mirai.console.data.ValueDescription
1414
import net.mamoe.mirai.console.data.value
1515

16+
@Suppress("RemoveExplicitTypeArguments")
1617
internal object PluginDependenciesConfig : ReadOnlyPluginConfig("PluginDependencies") {
1718
@ValueDescription("远程仓库, 如无必要无需修改")
18-
val repoLoc by value<String>("https://maven.aliyun.com/repository/public")
19+
val repoLoc by value(listOf<String>("https://maven.aliyun.com/repository/public"))
1920
}

mirai-console/backend/mirai-console/src/internal/plugin/BuiltInJvmPluginLoaderImpl.kt

+1
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@ internal class BuiltInJvmPluginLoaderImpl(
9999
ctx.sharedLibrariesLoader.addLib(artifactResult.artifact.file)
100100
ctx.sharedLibrariesDependencies.add(artifactResult.artifact.depId())
101101
logger.debug { "Linked static shared library: ${artifactResult.artifact}" }
102+
logger.verbose { "Linked static shared library: ${artifactResult.artifact.file}" }
102103
}
103104
}
104105
} else {

mirai-console/backend/mirai-console/src/internal/plugin/JvmPluginDependencyDownload.kt

+100-4
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,21 @@ import net.mamoe.mirai.utils.MiraiLogger
1616
import net.mamoe.mirai.utils.debug
1717
import net.mamoe.mirai.utils.verbose
1818
import org.apache.maven.repository.internal.MavenRepositorySystemUtils
19+
import org.codehaus.plexus.util.ReaderFactory
20+
import org.codehaus.plexus.util.xml.pull.MXParser
21+
import org.codehaus.plexus.util.xml.pull.XmlPullParser
1922
import org.eclipse.aether.RepositorySystem
2023
import org.eclipse.aether.RepositorySystemSession
24+
import org.eclipse.aether.artifact.Artifact
2125
import org.eclipse.aether.artifact.DefaultArtifact
2226
import org.eclipse.aether.collection.CollectRequest
2327
import org.eclipse.aether.connector.basic.BasicRepositoryConnectorFactory
2428
import org.eclipse.aether.graph.Dependency
2529
import org.eclipse.aether.graph.DependencyFilter
2630
import org.eclipse.aether.repository.LocalRepository
2731
import org.eclipse.aether.repository.RemoteRepository
32+
import org.eclipse.aether.repository.WorkspaceReader
33+
import org.eclipse.aether.repository.WorkspaceRepository
2834
import org.eclipse.aether.resolution.DependencyRequest
2935
import org.eclipse.aether.resolution.DependencyResult
3036
import org.eclipse.aether.spi.connector.RepositoryConnectorFactory
@@ -33,6 +39,7 @@ import org.eclipse.aether.spi.locator.ServiceLocator
3339
import org.eclipse.aether.transfer.AbstractTransferListener
3440
import org.eclipse.aether.transfer.TransferEvent
3541
import org.eclipse.aether.transport.http.HttpTransporterFactory
42+
import java.io.File
3643

3744

3845
@Suppress("DEPRECATION", "MemberVisibilityCanBePrivate")
@@ -63,6 +70,8 @@ internal class JvmPluginDependencyDownloader(
6370
"mirai-core-utils",
6471
"mirai-core-utils-jvm",
6572
"mirai-core-utils-android",
73+
"mirai-console",
74+
"mirai-console-terminal",
6675
)
6776
) return@DependencyFilter false
6877
}
@@ -96,12 +105,99 @@ internal class JvmPluginDependencyDownloader(
96105
logger.warning(event.exception)
97106
}
98107
}
108+
val userHome = System.getProperty("user.home")
109+
fun findMavenLocal(): File {
110+
val mavenHome = File(userHome, ".m2")
111+
fun findFromSettingsXml(): File? {
112+
val settings = File(mavenHome, "settings.xml")
113+
if (!settings.isFile) return null
114+
ReaderFactory.newXmlReader(settings).use { reader ->
115+
val parser = MXParser()
116+
parser.setInput(reader)
117+
118+
var eventType = parser.eventType
119+
var joinedSettings = false
120+
while (eventType != XmlPullParser.END_DOCUMENT) {
121+
when (eventType) {
122+
XmlPullParser.START_TAG -> {
123+
if (!joinedSettings) {
124+
if (parser.name != "settings") {
125+
return null
126+
}
127+
joinedSettings = true
128+
} else {
129+
if (parser.name == "localRepository") {
130+
val loc = File(parser.nextText())
131+
if (loc.isDirectory) return loc
132+
return null
133+
} else {
134+
parser.skipSubTree()
135+
}
136+
}
137+
}
138+
// else -> parser.skipSubTree()
139+
}
140+
eventType = parser.next()
141+
}
142+
}
143+
return null
144+
}
145+
return kotlin.runCatching {
146+
findFromSettingsXml()
147+
}.onFailure { error ->
148+
logger.warning(error)
149+
}.getOrNull() ?: File(mavenHome, "repository")
150+
}
151+
152+
fun findGradleDepCache(): File {
153+
return File(userHome, ".gradle/caches/modules-2/files-2.1")
154+
}
155+
156+
val mavenLocRepo = findMavenLocal()
157+
val gradleLocRepo = findGradleDepCache()
158+
logger.debug { "Maven local: $mavenLocRepo" }
159+
logger.debug { "Gradle cache local: $gradleLocRepo" }
160+
session.workspaceReader = object : WorkspaceReader {
161+
private val repository: WorkspaceRepository = WorkspaceRepository("default")
162+
override fun getRepository(): WorkspaceRepository = repository
163+
164+
override fun findArtifact(artifact: Artifact): File? {
165+
// logger.debug { "Try resolve $artifact" }
166+
val path = session.localRepositoryManager.getPathForLocalArtifact(artifact)
167+
File(mavenLocRepo, path).takeIf { it.isFile }?.let { return it }
168+
val gradleDep = gradleLocRepo
169+
.resolve(artifact.groupId)
170+
.resolve(artifact.artifactId)
171+
.resolve(artifact.baseVersion)
172+
if (gradleDep.isDirectory) {
173+
val fileName = buildString {
174+
append(artifact.artifactId)
175+
append('-')
176+
append(artifact.baseVersion)
177+
artifact.classifier?.takeIf { it.isNotEmpty() }?.let { c ->
178+
append('-').append(c)
179+
}
180+
append('.').append(artifact.extension)
181+
}
182+
gradleDep.walk().maxDepth(2)
183+
.filter { it.isFile }
184+
.firstOrNull { it.name == fileName }
185+
?.let { return it }
186+
}
187+
return null
188+
}
189+
190+
override fun findVersions(artifact: Artifact?): MutableList<String> {
191+
return mutableListOf()
192+
}
193+
194+
}
99195
session.setReadOnly()
100196
repositories = repository.newResolutionRepositories(
101197
session,
102-
// listOf(RemoteRepository.Builder("central", "default", "https://repo.maven.apache.org/maven2").build())
103-
// listOf(RemoteRepository.Builder("central", "default", "https://maven.aliyun.com/repository/public").build())
104-
listOf(RemoteRepository.Builder("central", "default", PluginDependenciesConfig.repoLoc).build())
198+
PluginDependenciesConfig.repoLoc.map { url ->
199+
RemoteRepository.Builder(null, "default", url).build()
200+
}
105201
)
106202
logger.debug { "Remote server: " + PluginDependenciesConfig.repoLoc }
107203
}
@@ -115,7 +211,7 @@ internal class JvmPluginDependencyDownloader(
115211
dependencies.add(dependency)
116212
}
117213
return repository.resolveDependencies(
118-
session as RepositorySystemSession?, DependencyRequest(
214+
session, DependencyRequest(
119215
CollectRequest(
120216
null as Dependency?, dependencies,
121217
repositories

0 commit comments

Comments
 (0)