Add support for compile-time dependencies in :API

This commit is contained in:
2021-03-02 20:00:31 +01:00
parent c5e2888048
commit 95ee0a5c62
7 changed files with 55 additions and 7 deletions

View File

@@ -10,5 +10,10 @@ repositories {
}
dependencies {
implementation "org.joml:joml:${jomlVersion}"
}
task relayDependencies(type: Copy) {
from configurations.runtimeClasspath
into file("build/dependencies")
}

View File

@@ -23,8 +23,6 @@ javafx {
modules = ['javafx.controls', 'javafx.graphics']
}
compileKotlin {
kotlinOptions.jvmTarget = "14"
}
@@ -57,6 +55,13 @@ task provideGameEngine(type: Copy) {
into file("build/resources/main/engine")
}
task provideApiDependencies(type: Copy) {
dependsOn(":api:relayDependencies")
from project(':api').file('build/dependencies')
into file("build/resources/main/dependencies")
}
task provideApi(type: Copy) {
from project(':api').file('src/main/java')
into file('build/resources/main/api')
@@ -76,6 +81,7 @@ task provideApi(type: Copy) {
processResources {
dependsOn(provideGameEngine)
dependsOn(provideApiDependencies)
dependsOn(provideApi)
}

View File

@@ -4,5 +4,5 @@ import com.bartlomiejpluta.base.editor.file.model.FileSystemNode
import java.io.File
interface Compiler {
fun compile(sourceDirectory: FileSystemNode, targetDirectory: File)
fun compile(sourceDirectory: FileSystemNode, targetDirectory: File, classPath: Array<File> = emptyArray())
}

View File

@@ -22,8 +22,8 @@ class JaninoCompiler : Compiler {
@Autowired
private lateinit var apiProvider: APIProvider
override fun compile(sourceDirectory: FileSystemNode, targetDirectory: File) = try {
tryToCompile(sourceDirectory, targetDirectory)
override fun compile(sourceDirectory: FileSystemNode, targetDirectory: File, classPath: Array<File>) = try {
tryToCompile(sourceDirectory, targetDirectory, classPath)
/* Because Janino parser does not provide error handler for parsers:
*
@@ -42,12 +42,14 @@ class JaninoCompiler : Compiler {
throw BuildException(Severity.ERROR, "Compiler", e.location, message, e)
}
private fun tryToCompile(sourceDirectory: FileSystemNode, targetDirectory: File) {
private fun tryToCompile(sourceDirectory: FileSystemNode, targetDirectory: File, classPath: Array<File>) {
val compilationUnits = prepareCompilationUnits(sourceDirectory)
compilerFactory.newCompiler().apply {
setDestinationDirectory(targetDirectory, false)
setClassPath(classPath)
setWarningHandler { handle, message, location ->
eventbus.fire(AppendBuildLogsEvent(Severity.WARNING, "$message ($handle)", location, "Compiler"))
}

View File

@@ -5,6 +5,7 @@ import com.bartlomiejpluta.base.editor.code.build.exception.BuildException
import com.bartlomiejpluta.base.editor.code.build.game.GameEngineProvider
import com.bartlomiejpluta.base.editor.code.build.packager.JarPackager
import com.bartlomiejpluta.base.editor.code.build.project.ProjectAssembler
import com.bartlomiejpluta.base.editor.code.dependency.DependenciesProvider
import com.bartlomiejpluta.base.editor.common.logs.enumeration.Severity
import com.bartlomiejpluta.base.editor.event.AppendBuildLogsEvent
import com.bartlomiejpluta.base.editor.event.ClearBuildLogsEvent
@@ -19,6 +20,9 @@ import tornadofx.FX.Companion.eventbus
@Component
class DefaultBuildPipelineService : BuildPipelineService {
@Autowired
private lateinit var dependenciesProvider: DependenciesProvider
@Autowired
private lateinit var compiler: Compiler
@@ -76,8 +80,11 @@ class DefaultBuildPipelineService : BuildPipelineService {
val outputFile = project.buildOutputJarFile
val startTime = System.currentTimeMillis()
eventbus.fire(AppendBuildLogsEvent(Severity.INFO, "Providing compile-time dependencies...", tag = TAG))
val dependencies = dependenciesProvider.provideDependenciesTo(project.buildDependenciesDirectory)
eventbus.fire(AppendBuildLogsEvent(Severity.INFO, "Compiling sources...", tag = TAG))
compiler.compile(project.codeFSNode, project.buildClassesDirectory)
compiler.compile(project.codeFSNode, project.buildClassesDirectory, dependencies.toTypedArray())
eventbus.fire(AppendBuildLogsEvent(Severity.INFO, "Assembling game engine...", tag = TAG))
engineProvider.provideBaseGameEngine(outputFile)
@@ -95,6 +102,7 @@ class DefaultBuildPipelineService : BuildPipelineService {
project.buildClassesDirectory.mkdirs()
project.buildOutDirectory.mkdirs()
project.buildDependenciesDirectory.mkdirs()
}
override fun clean() {

View File

@@ -0,0 +1,21 @@
package com.bartlomiejpluta.base.editor.code.dependency
import org.springframework.beans.factory.annotation.Value
import org.springframework.core.io.Resource
import org.springframework.stereotype.Component
import java.io.File
@Component
class DependenciesProvider {
@Value("classpath:dependencies/*.jar")
private lateinit var dependencies: Array<Resource>
fun provideDependenciesTo(root: File) = dependencies
.filter { it.filename != null }
.map {
File(root, it.filename!!).apply {
it.inputStream.transferTo(outputStream())
}
}
}

View File

@@ -64,6 +64,10 @@ class Project {
var buildClassesDirectory by buildClassesDirectoryProperty
private set
val buildDependenciesDirectoryProperty = SimpleObjectProperty<File>()
var buildDependenciesDirectory by buildDependenciesDirectoryProperty
private set
val buildOutDirectoryProperty = SimpleObjectProperty<File>()
var buildOutDirectory by buildOutDirectoryProperty
private set
@@ -82,6 +86,7 @@ class Project {
codeDirectory = File(it, CODE_DIR)
buildDirectory = File(it, BUILD_DIR)
buildClassesDirectory = File(it, BUILD_CLASSES_DIR)
buildDependenciesDirectory = File(it, BUILD_DEPENDENCIES_DIR)
buildOutDirectory = File(it, BUILD_OUT_DIR)
}
}
@@ -108,5 +113,6 @@ class Project {
const val BUILD_DIR = "build"
const val BUILD_CLASSES_DIR = "$BUILD_DIR/classes"
const val BUILD_OUT_DIR = "$BUILD_DIR/out"
const val BUILD_DEPENDENCIES_DIR = "$BUILD_DIR/dependencies"
}
}