kotlin multiplatform and proto kind of working?

This commit is contained in:
Adam 2021-10-31 11:32:27 +01:00
parent 5bb5f42af0
commit 6dce641d6b
9 changed files with 207 additions and 22 deletions

View file

@ -50,4 +50,4 @@ class IntelliJPattern : Plugin<Project> {
} }
} }
} }

View file

@ -7,7 +7,7 @@ import org.gradle.api.tasks.SourceSetContainer
import org.gradle.kotlin.dsl.findByType import org.gradle.kotlin.dsl.findByType
import org.jetbrains.kotlin.gradle.dsl.KotlinJvmProjectExtension import org.jetbrains.kotlin.gradle.dsl.KotlinJvmProjectExtension
class KotlinProjectConfiguration : Plugin<Project> { class KotlinJvmProjectConfiguration : Plugin<Project> {
override fun apply(project: Project) { override fun apply(project: Project) {
addSourceSets(project) addSourceSets(project)
@ -15,16 +15,18 @@ class KotlinProjectConfiguration : Plugin<Project> {
private fun addSourceSets(project: Project) { private fun addSourceSets(project: Project) {
project.extensions.findByType<KotlinJvmProjectExtension>()?.apply { project.beforeEvaluate {
extensions.findByType<KotlinJvmProjectExtension>()?.apply {
project.extensions.findByType<SourceSetContainer>() extensions.findByType<SourceSetContainer>()
?.named(SourceSet.MAIN_SOURCE_SET_NAME) ?.named(SourceSet.MAIN_SOURCE_SET_NAME)
?.configure { ?.configure {
java { java {
srcDir(project.layout.buildDirectory.dir("pbAndG/generated-sources/java")) srcDir(layout.buildDirectory.dir("pbAndG/generated-sources/java"))
srcDir(project.layout.buildDirectory.dir("pbAndG/generated-sources/kotlin")) srcDir(layout.buildDirectory.dir("pbAndG/generated-sources/kotlin"))
}
} }
}
}
// val srcSet = project.extensions.getByName<SourceSet>(SourceSet.MAIN_SOURCE_SET_NAME) // val srcSet = project.extensions.getByName<SourceSet>(SourceSet.MAIN_SOURCE_SET_NAME)
// //

View file

@ -0,0 +1,61 @@
package dev.adamko.gradle.pbandg.pattern
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.kotlin.dsl.findByType
import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
class KotlinMultiplatformProjectConfiguration : Plugin<Project> {
override fun apply(project: Project) {
project.afterEvaluate {
addSourceSets(this)
}
}
private fun addSourceSets(project: Project) {
project.extensions.findByType<KotlinMultiplatformExtension>()?.apply {
project.logger.lifecycle("Kotlin Multiplatform source sets: ${sourceSets.joinToString { "${it.name} / ${it.kotlin.sourceDirectories.files.joinToString()}" }}")
sourceSets.whenObjectAdded {
this.name
}
//
// val protoJvm = this.sourceSets.maybeCreate("protoJvm").apply {
// kotlin.srcDir(project.layout.buildDirectory.dir("pbAndG/generated-sources/java"))
// kotlin.srcDir(project.layout.buildDirectory.dir("pbAndG/generated-sources/kotlin"))
// }
//
// val protoTypescript = this.sourceSets.maybeCreate("protoJvm").apply {
// kotlin.srcDir(project.layout.buildDirectory.dir("pbAndG/generated-sources/typescript"))
// }
this.sourceSets.named("jvmMain").configure {
// dependsOn(protoJvm)
kotlin.srcDir(project.layout.buildDirectory.dir("pbAndG/generated-sources/java"))
kotlin.srcDir(project.layout.buildDirectory.dir("pbAndG/generated-sources/kotlin"))
}
this.sourceSets.named("jsMain").configure {
// dependsOn(protoTypescript)
kotlin.srcDir(project.layout.buildDirectory.dir("pbAndG/generated-sources/typescript"))
}
project.logger.lifecycle("Kotlin Multiplatform source sets: ${sourceSets.joinToString { "${it.name} / ${it.kotlin.sourceDirectories.files.joinToString()}" }}")
//
// targets .forEach {
// when (it.platformType){
// KotlinPlatformType.jvm -> TODO()
// KotlinPlatformType.js -> {
// it.defaultConfigurationName
// }
// KotlinPlatformType.androidJvm -> {}
// KotlinPlatformType.common -> {}
// KotlinPlatformType.native -> {}
// }
// }
}
}
}

View file

@ -1,7 +1,7 @@
package dev.adamko.gradle.pbandg package dev.adamko.gradle.pbandg
import dev.adamko.gradle.pbandg.pattern.IntelliJPattern import dev.adamko.gradle.pbandg.pattern.KotlinJvmProjectConfiguration
import dev.adamko.gradle.pbandg.pattern.KotlinProjectConfiguration import dev.adamko.gradle.pbandg.pattern.KotlinMultiplatformProjectConfiguration
import dev.adamko.gradle.pbandg.settings.PBAndGSettings import dev.adamko.gradle.pbandg.settings.PBAndGSettings
import dev.adamko.gradle.pbandg.task.ProtobufCompileTask import dev.adamko.gradle.pbandg.task.ProtobufCompileTask
import dev.adamko.gradle.pbandg.task.ProtobufPrepareLibrariesTask import dev.adamko.gradle.pbandg.task.ProtobufPrepareLibrariesTask
@ -24,8 +24,15 @@ plugins {
//if (plugins.hasPlugin(IdeaPlugin::class)) { //if (plugins.hasPlugin(IdeaPlugin::class)) {
// IntelliJPattern().apply(project) // IntelliJPattern().apply(project)
//} //}
if (plugins.hasPlugin("org.jetbrains.kotlin.jvm")) {
KotlinProjectConfiguration().apply(project) plugins.withId("org.jetbrains.kotlin.jvm") {
logger.info("Configuring Kotlin JVM plugin for PB&G")
KotlinJvmProjectConfiguration().apply(project)
}
plugins.withId("org.jetbrains.kotlin.multiplatform") {
logger.info("Configuring Kotlin Multiplatform plugin for PB&G")
KotlinMultiplatformProjectConfiguration().apply(project)
} }
val pbAndGSettings = val pbAndGSettings =

View file

@ -1,7 +1,9 @@
plugins { plugins {
id("dev.adamko.factoriowebmap.archetype.kotlin-jvm") id("dev.adamko.factoriowebmap.archetype.base")
kotlin("multiplatform")
// id("dev.adamko.factoriowebmap.archetype.kotlin-jvm")
id("dev.adamko.gradle.pbandg.pb-and-g") id("dev.adamko.gradle.pbandg.pb-and-g")
`kotlin-dsl`
} }
val projectId: String by project.extra val projectId: String by project.extra
@ -10,15 +12,128 @@ val buildDir: Directory = layout.buildDirectory.dir(projectId).get()
dependencies { dependencies {
protobufLibrary("com.google.protobuf:protobuf-javalite:3.19.1") protobufLibrary("com.google.protobuf:protobuf-javalite:3.19.1")
//
api("com.google.protobuf:protobuf-javalite:3.19.1") // api("com.google.protobuf:protobuf-javalite:3.19.1")
api("com.google.protobuf:protobuf-kotlin-lite:3.19.1") // api("com.google.protobuf:protobuf-kotlin-lite:3.19.1")
} }
tasks.protobufCompile { tasks.protobufCompile {
protoFile.set(layout.projectDirectory.file("src/main/proto/FactorioServerLogRecord.proto")) protoFile.set(layout.projectDirectory.file("src/proto/FactorioServerLogRecord.proto"))
} }
sourceSets { idea {
workspace {
}
}
kotlin {
sourceSets.all {
languageSettings.apply {
languageVersion = "1.5"
// enableLanguageFeature("InlineClasses") // language feature name
optIn("kotlin.OptIn")
optIn("kotlin.ExperimentalStdlibApi")
optIn("kotlin.time.ExperimentalTime")
optIn("kotlinx.coroutines.ExperimentalCoroutinesApi")
// progressiveMode = true // false by default
}
}
//<editor-fold desc="Protobuf">
sourceSets {
val proto by creating {
}
}
//</editor-fold>
//<editor-fold desc="Java">
jvm {
compilations.configureEach {
kotlinOptions {
jvmTarget = "11"
}
}
}
sourceSets {
val jvmMain by getting {
dependencies {
api("com.google.protobuf:protobuf-javalite:3.19.1")
api("com.google.protobuf:protobuf-kotlin-lite:3.19.1")
}
}
val jvmTest by getting {
}
}
//</editor-fold>
//<editor-fold desc="JS">
js(IR) {
binaries.executable()
browser {
commonWebpackConfig {
cssSupport.enabled = true
}
}
useCommonJs()
nodejs()
compilations["main"].apply {
packageJson {
customField(
"scripts",
mapOf(
"build" to "tstl",
"dev" to "tstl --watch",
)
)
}
}
}
sourceSets {
val jsMain by getting {
kotlin.srcDir("externals02")
// kotlin.srcDir("externals")
dependencies {
val kotlinWrappersVersion = "0.0.1-pre.254-kotlin-1.5.31"
implementation(
project.dependencies.enforcedPlatform(
"org.jetbrains.kotlin-wrappers:kotlin-wrappers-bom:${kotlinWrappersVersion}"
)
)
// implementation("org.jetbrains.kotlin-wrappers:kotlin-react")
// implementation("org.jetbrains.kotlin-wrappers:kotlin-react-dom")
// implementation(npm("react", "17.0.2"))
// implementation(npm("react-dom", "17.0.2"))
// implementation("org.jetbrains.kotlinx:kotlinx-nodejs:0.0.7") {
// because("https://github.com/Kotlin/kotlinx-nodejs")
// }
// implementation(npm("typescript-to-lua", "1.0.1"))
// implementation(npm("typed-factorio", "0.7.1"))
// implementation(npm("lua-types", "2.11.0"))
// implementation(npm("typescript", "4.4.3"))
implementation(npm("ts-proto", "1.83.3"))
}
}
val jsTest by getting {
dependencies {
implementation(kotlin("test-js"))
}
}
}
//</editor-fold>
} }