Be lazier in configuring Forge runs

This commit is contained in:
Jonathan Coates 2023-06-29 22:31:49 +01:00
parent f5b16261cc
commit 34f41c4039
No known key found for this signature in database
GPG Key ID: B9E431FF07C98D06
3 changed files with 47 additions and 19 deletions

View File

@ -28,10 +28,13 @@ jobs:
echo "org.gradle.daemon=false" >> ~/.gradle/gradle.properties echo "org.gradle.daemon=false" >> ~/.gradle/gradle.properties
- name: Build with Gradle - name: Build with Gradle
run: | run: ./gradlew assemble || ./gradlew assemble
./gradlew assemble || ./gradlew assemble
./gradlew downloadAssets || ./gradlew downloadAssets - name: Download assets for game tests
./gradlew build run: ./gradlew downloadAssets || ./gradlew downloadAssets
- name: Run tests and linters
run: ./gradlew build
- name: Run client tests - name: Run client tests
run: ./gradlew runGametestClient # Not checkClient, as no point running rendering tests. run: ./gradlew runGametestClient # Not checkClient, as no point running rendering tests.

View File

@ -17,7 +17,7 @@
fun JavaExec.setRunConfig(config: RunConfig) { fun JavaExec.setRunConfig(config: RunConfig) {
dependsOn("prepareRuns") dependsOn("prepareRuns")
setRunConfigInternal(project, this, config) setRunConfigInternal(project, this, config)
doFirst("Create working directory") { Files.createDirectories(workingDir.toPath().parent) } doFirst("Create working directory") { Files.createDirectories(workingDir.toPath()) }
javaLauncher.set( javaLauncher.set(
project.extensions.getByType(JavaToolchainService::class.java) project.extensions.getByType(JavaToolchainService::class.java)

View File

@ -6,8 +6,12 @@
import net.minecraftforge.gradle.common.util.RunConfig import net.minecraftforge.gradle.common.util.RunConfig
import org.gradle.api.Project import org.gradle.api.Project
import org.gradle.process.CommandLineArgumentProvider
import org.gradle.process.JavaExecSpec import org.gradle.process.JavaExecSpec
import java.io.File import java.io.File
import java.util.function.Supplier
import java.util.stream.Collectors
import java.util.stream.Stream
/** /**
* Set up a [JavaExecSpec] to execute a [RunConfig]. * Set up a [JavaExecSpec] to execute a [RunConfig].
@ -18,27 +22,48 @@
* Unfortunately most of the functionality we need is package-private, and so we have to put our code into the package. * Unfortunately most of the functionality we need is package-private, and so we have to put our code into the package.
*/ */
internal fun setRunConfigInternal(project: Project, spec: JavaExecSpec, config: RunConfig) { internal fun setRunConfigInternal(project: Project, spec: JavaExecSpec, config: RunConfig) {
val originalTask = project.tasks.named(config.taskName, MinecraftRunTask::class.java).get()
spec.workingDir = File(config.workingDirectory) spec.workingDir = File(config.workingDirectory)
spec.mainClass.set(config.main) spec.mainClass.set(config.main)
for (source in config.allSources) spec.classpath(source.runtimeClasspath) for (source in config.allSources) spec.classpath(source.runtimeClasspath)
val lazyTokens = RunConfigGenerator.configureTokensLazy( val originalTask = project.tasks.named(config.taskName, MinecraftRunTask::class.java)
project, config,
RunConfigGenerator.mapModClassesToGradle(project, config), // Add argument and JVM argument via providers, to be as lazy as possible with fetching artifacts.
originalTask.minecraftArtifacts.files, fun lazyTokens(): MutableMap<String, Supplier<String>> {
originalTask.runtimeClasspathArtifacts.files, return RunConfigGenerator.configureTokensLazy(
project, config, RunConfigGenerator.mapModClassesToGradle(project, config),
originalTask.get().minecraftArtifacts.files,
originalTask.get().runtimeClasspathArtifacts.files,
)
}
spec.argumentProviders.add(
CommandLineArgumentProvider {
RunConfigGenerator.getArgsStream(config, lazyTokens(), false).toList()
},
)
spec.jvmArgumentProviders.add(
CommandLineArgumentProvider {
val lazyTokens = lazyTokens()
(if (config.isClient) config.jvmArgs + originalTask.get().additionalClientArgs.get() else config.jvmArgs).map { config.replace(lazyTokens, it) } +
config.properties.map { (k, v) -> "-D${k}=${config.replace(lazyTokens, v)}" }
},
) )
spec.args(RunConfigGenerator.getArgsStream(config, lazyTokens, false).toList()) // We can't configure environment variables lazily, so we do these now with a more minimal lazyTokens set.
val lazyTokens = mutableMapOf<String, Supplier<String>>()
spec.jvmArgs( for ((k, v) in config.tokens) lazyTokens[k] = Supplier<String> { v }
(if (config.isClient) config.jvmArgs + originalTask.additionalClientArgs.get() else config.jvmArgs) for ((k, v) in config.lazyTokens) lazyTokens[k] = v
.map { config.replace(lazyTokens, it) }, lazyTokens.compute(
"source_roots",
{ key: String, sourceRoots: Supplier<String>? ->
Supplier<String> {
val modClasses = RunConfigGenerator.mapModClassesToGradle(project, config)
(if (sourceRoots != null) Stream.concat<String>(
sourceRoots.get().split(File.pathSeparator).stream(), modClasses,
) else modClasses).distinct().collect(Collectors.joining(File.pathSeparator))
}
},
) )
for ((key, value) in config.environment) spec.environment(key, config.replace(lazyTokens, value)) for ((key, value) in config.environment) spec.environment(key, config.replace(lazyTokens, value))
for ((key, value) in config.properties) spec.systemProperty(key, config.replace(lazyTokens, value))
} }