fix local dependencies not resolving properly

This commit is contained in:
Julian Krings 2025-07-31 17:08:50 +02:00
parent 67f456cf53
commit 96efc15c36
No known key found for this signature in database
GPG Key ID: 208C6E08C3B718D2
3 changed files with 25 additions and 6 deletions

View File

@ -1,7 +1,7 @@
package com.volmit.iris.core.scripting.kotlin.runner
import java.io.File
import java.util.Collections.synchronizedList
import java.util.concurrent.ConcurrentHashMap
import kotlin.script.experimental.api.ResultWithDiagnostics
import kotlin.script.experimental.api.SourceCode
import kotlin.script.experimental.api.asSuccess
@ -13,7 +13,7 @@ import kotlin.script.experimental.dependencies.impl.toRepositoryUrlOrNull
class FileDependenciesResolver(
private val baseDir: File,
) : ExternalDependenciesResolver {
private val localRepos = synchronizedList(arrayListOf(baseDir))
private val localRepos = ConcurrentHashMap.newKeySet<File>(1).also { it.add(baseDir) }
private fun String.toRepositoryFileOrNull(): File? =
File(baseDir, this).takeIf { it.exists() && it.isDirectory }
@ -62,4 +62,4 @@ class FileDependenciesResolver(
override fun acceptsRepository(repositoryCoordinates: RepositoryCoordinates): Boolean = repositoryCoordinates.toFilePath() != null
}
}

View File

@ -49,6 +49,7 @@ class ScriptRunner(
type
) {
dependencyResolver(resolver)
packDirectory(baseDir)
if (SimpleScript::class.java.isAssignableFrom(type.java))
return@createCompilationConfigurationFromTemplate

View File

@ -4,7 +4,7 @@ import kotlinx.coroutines.runBlocking
import java.io.File
import kotlin.script.experimental.api.*
import kotlin.script.experimental.dependencies.CompoundDependenciesResolver
import kotlin.script.experimental.dependencies.FileSystemDependenciesResolver
import kotlin.script.experimental.dependencies.addRepository
import kotlin.script.experimental.dependencies.maven.MavenDependenciesResolver
import kotlin.script.experimental.dependencies.resolveFromScriptSourceAnnotations
import kotlin.script.experimental.jvm.updateClasspath
@ -23,7 +23,8 @@ internal fun ResultValue.valueOrNull(): Any? =
else -> null
}
internal fun createResolver(baseDir: File = File(".").normalize()) = CompoundDependenciesResolver(FileDependenciesResolver(baseDir), MavenDependenciesResolver())
private val workDir = File(".").normalize()
internal fun createResolver(baseDir: File = workDir) = CompoundDependenciesResolver(FileDependenciesResolver(baseDir), MavenDependenciesResolver())
private val resolver = createResolver()
internal fun configureMavenDepsOnAnnotations(context: ScriptConfigurationRefinementContext): ResultWithDiagnostics<ScriptCompilationConfiguration> {
@ -31,7 +32,23 @@ internal fun configureMavenDepsOnAnnotations(context: ScriptConfigurationRefinem
?: return context.compilationConfiguration.asSuccess()
val resolver = context.compilationConfiguration[ScriptCompilationConfiguration.dependencyResolver] ?: resolver
val packDirectory = context.compilationConfiguration[ScriptCompilationConfiguration.packDirectory] ?: context.script.locationId?.let(::File)?.takeIf { it.exists() }?.run {
val parts = normalize().absolutePath.split(File.separatorChar)
var packDir: File? = null
for (i in parts.size - 1 downTo 1) {
if (parts[i] != "scripts") continue
val pack = File(parts.subList(0, i).joinToString(File.separator))
if (!File(pack, "dimensions${File.separator}${parts[i - 1]}.json").exists())
continue
packDir = pack
break
}
packDir
} ?: workDir
return runBlocking {
resolver.addRepository(packDirectory.toURI().toURL().toString())
resolver.resolveFromScriptSourceAnnotations(annotations)
}.onSuccess {
context.compilationConfiguration.with {
@ -46,4 +63,5 @@ fun <R> ResultWithDiagnostics<R>.valueOrThrow(message: CharSequence): R = valueO
throw RuntimeException(it.reports.joinToString("\n", "$message\n") { r -> r.render(withStackTrace = true) })
}
val ScriptCompilationConfigurationKeys.dependencyResolver by PropertiesCollection.key(resolver)
val ScriptCompilationConfigurationKeys.dependencyResolver by PropertiesCollection.key(resolver)
val ScriptCompilationConfigurationKeys.packDirectory by PropertiesCollection.key<File>()