jvm+kt+ts code gen working

This commit is contained in:
Adam 2021-11-03 09:48:30 +01:00
parent ac8428f36d
commit 96d8ceda2c
4 changed files with 108 additions and 138 deletions

View file

@ -24,6 +24,11 @@ dependencies {
} }
tasks.withType<KotlinCompile>().configureEach { tasks.withType<KotlinCompile>().configureEach {
kotlinOptions {
jvmTarget = "11"
}
kotlinOptions.freeCompilerArgs += listOf( kotlinOptions.freeCompilerArgs += listOf(
"-Xopt-in=kotlin.OptIn", "-Xopt-in=kotlin.OptIn",
"-Xopt-in=kotlin.ExperimentalStdlibApi", "-Xopt-in=kotlin.ExperimentalStdlibApi",

View file

@ -10,7 +10,7 @@ class KotlinMultiplatformProjectConfiguration : Plugin<Project> {
override fun apply(project: Project) { override fun apply(project: Project) {
project.afterEvaluate { project.afterEvaluate {
addSourceSets(this) addSourceSets(project)
} }
} }
@ -19,10 +19,6 @@ class KotlinMultiplatformProjectConfiguration : Plugin<Project> {
project.extensions.findByType<KotlinMultiplatformExtension>()?.apply { project.extensions.findByType<KotlinMultiplatformExtension>()?.apply {
project.logger.lifecycle("Kotlin Multiplatform source sets: ${sourceSets.joinToString { "${it.name} / ${it.kotlin.sourceDirectories.files.joinToString()}" }}") project.logger.lifecycle("Kotlin Multiplatform source sets: ${sourceSets.joinToString { "${it.name} / ${it.kotlin.sourceDirectories.files.joinToString()}" }}")
// sourceSets.whenObjectAdded {
// this.name
// }
//
val jvmProto = this.sourceSets.maybeCreate("jvmProto").apply { val jvmProto = this.sourceSets.maybeCreate("jvmProto").apply {
kotlin.srcDir(project.layout.pbAndGBuildDir.get().dir("generated-sources/java")) kotlin.srcDir(project.layout.pbAndGBuildDir.get().dir("generated-sources/java"))
@ -55,7 +51,7 @@ class KotlinMultiplatformProjectConfiguration : Plugin<Project> {
// //
// targets .forEach { // targets .forEach {
// when (it.platformType){ // when (it.platformType){
// KotlinPlatformType.jvm -> TODO() // KotlinPlatformType.jvm -> {}
// KotlinPlatformType.js -> { // KotlinPlatformType.js -> {
// it.defaultConfigurationName // it.defaultConfigurationName
// } // }

View file

@ -1,8 +1,6 @@
package dev.adamko.gradle.pbandg package dev.adamko.gradle.pbandg
import dev.adamko.gradle.pbandg.Constants.pbAndGBuildDir import dev.adamko.gradle.pbandg.Constants.pbAndGBuildDir
import dev.adamko.gradle.pbandg.pattern.KotlinJvmProjectConfiguration
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
@ -19,21 +17,21 @@ plugins {
// IntelliJPattern().apply(project) // IntelliJPattern().apply(project)
//} //}
plugins.withId("org.jetbrains.kotlin.jvm") { //plugins.withId("org.jetbrains.kotlin.jvm") {
logger.info("Configuring Kotlin JVM plugin for PB&G") // logger.info("Configuring Kotlin JVM plugin for PB&G")
KotlinJvmProjectConfiguration().apply(project) // KotlinJvmProjectConfiguration().apply(project)
} //}
//
plugins.withId("org.jetbrains.kotlin.multiplatform") { //plugins.withId("org.jetbrains.kotlin.multiplatform") {
logger.info("Configuring Kotlin Multiplatform plugin for PB&G") // logger.info("Configuring Kotlin Multiplatform plugin for PB&G")
KotlinMultiplatformProjectConfiguration().apply(project) // KotlinMultiplatformProjectConfiguration().apply(project)
} //}
val pbAndGSettings = val pbAndGSettings =
project.extensions.create(Constants.PBG_SETTINGS_NAME, PBAndGSettings::class, project) project.extensions.create(Constants.PBG_SETTINGS_NAME, PBAndGSettings::class, project)
//val protocDep = ProtobufCompilerDependency(project, pbAndGSettings) //val protocDep = ProtobufCompilerDependency(project, pbAndGSettings)
val protocDep = project.configurations.create("protobufCompiler") { val protocDep: Configuration = project.configurations.create("protobufCompiler") {
this.description = "Define a single dependency that provides the protoc.exe for this system" this.description = "Define a single dependency that provides the protoc.exe for this system"
isVisible = false isVisible = false
isCanBeConsumed = false isCanBeConsumed = false
@ -53,14 +51,10 @@ val protobufLibraryDependencies: Configuration =
isTransitive = false isTransitive = false
} }
project.dependencies { project.dependencies {
protobufLibraryDependencies("com.google.protobuf:protobuf-javalite:3.19.1") protobufLibraryDependencies("com.google.protobuf:protobuf-javalite:3.19.1") {
// implementation("com.google.protobuf:protobuf-javalite:3.19.1") because("This dep contains common Google .proto files that will be extracted")
// implementation("com.google.protobuf:protobuf-kotlin-lite:3.19.1") }
// protobufLibraryDependencies("com.google.protobuf:protobuf-javalite:3.19.1")
//// implementation("com.google.protobuf:protobuf-javalite:3.19.1")
//// implementation("com.google.protobuf:protobuf-kotlin-lite:3.19.1")
} }
val protobufPrepareLibrariesTask = val protobufPrepareLibrariesTask =
@ -73,7 +67,7 @@ project.tasks.withType<ProtobufCompileTask> {
protobufLibraryDirectories.add(protobufPrepareLibrariesTask.flatMap { it.librariesDirectory }) protobufLibraryDirectories.add(protobufPrepareLibrariesTask.flatMap { it.librariesDirectory })
val exe = protocDep.singleFile val exe = protocDep.singleFile
logger.lifecycle("protoc.exe: $exe") logger.debug("Configuring Protobuf task with protoc.exe: $exe")
protocExecutable.set(exe) protocExecutable.set(exe)
} }
@ -84,18 +78,11 @@ val aggregateTask = project.tasks.register<Sync>("protobufCompileAll") {
val genSrcDir = project.layout.pbAndGBuildDir.map { it.dir("generated-sources") } val genSrcDir = project.layout.pbAndGBuildDir.map { it.dir("generated-sources") }
val pbCompileTasks = tasks.withType<ProtobufCompileTask>() val pbCompileTasks = tasks.withType<ProtobufCompileTask>()
from(pbCompileTasks.map { it.temporaryDir }) from(pbCompileTasks.map { it.temporaryDir })
into(genSrcDir) into(genSrcDir)
includeEmptyDirs = false includeEmptyDirs = false
} }
//project.tasks.assemble { dependsOn(aggregateTask) }
///** Convert `.proto` files to Kotlin */
//val pbCompileTask = project.tasks.create<ProtobufCompileTask>("protobufJava") {
// protocOutputs += KotlinOutput()
// protocOutputs += JavaOutput()
//}
project.tasks.assemble { dependsOn(aggregateTask) }

View file

@ -1,46 +1,18 @@
import dev.adamko.gradle.pbandg.task.ProtobufCompileTask import dev.adamko.gradle.pbandg.task.ProtobufCompileTask
//import org.jetbrains.kotlin.gradle.targets.js.npm.NpmProject import org.jetbrains.kotlin.gradle.targets.js.npm.NpmProject
//import org.jetbrains.kotlin.gradle.targets.js.npm.tasks.RootPackageJsonTask import org.jetbrains.kotlin.gradle.targets.js.npm.tasks.RootPackageJsonTask
plugins { plugins {
id("dev.adamko.factoriowebmap.archetype.base") id("dev.adamko.factoriowebmap.archetype.base")
kotlin("multiplatform") 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")
} }
val projectId: String by project.extra val projectId: String by project.extra
val buildDir: Directory = layout.buildDirectory.dir(projectId).get() val buildDir: Directory = layout.buildDirectory.dir(projectId).get()
dependencies {
protobufLibrary("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")
}
kotlin { 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")
// optIn("kotlin.js.ExperimentalJsExport")
//// progressiveMode = true // false by default
// }
// }
//<editor-fold desc="Protobuf">
// sourceSets {
// val proto by creating {
// }
// }
//</editor-fold>
//<editor-fold desc="Java"> //<editor-fold desc="Java">
jvm { jvm {
@ -51,21 +23,6 @@ kotlin {
} }
} }
//</editor-fold>
//<editor-fold desc="JS">
// js(IR) {
// binaries.executable()
//// browser {
////// commonWebpackConfig {
////// cssSupport.enabled = true
////// }
//// }
//
// useCommonJs()
// nodejs()
//
// }
sourceSets { sourceSets {
val jvmMain by getting { val jvmMain by getting {
@ -76,76 +33,101 @@ kotlin {
} }
val jvmTest by getting { val jvmTest by getting {
} }
}
// val jsMain by getting { //</editor-fold>
// dependencies {
// implementation(npm("ts-proto", "1.83.3")) //<editor-fold desc="JS">
// } js(IR) {
// } browser()
// }
// val jsTest by getting {
// dependencies { sourceSets {
// implementation(kotlin("test-js")) val jsMain by getting {
// } dependencies {
// } implementation(npm("ts-proto", "1.83.3"))
}
}
val jsTest by getting {
dependencies {
implementation(kotlin("test-js"))
}
}
} }
//</editor-fold> //</editor-fold>
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")
optIn("kotlin.js.ExperimentalJsExport")
// progressiveMode = true // false by default
}
}
} }
//rootProject.tasks.withType<RootPackageJsonTask>().configureEach { dependencies {
//} protobufLibrary("com.google.protobuf:protobuf-javalite:3.19.1")
//val rootPackageJson by rootProject.tasks.getting(RootPackageJsonTask::class)
//val nodePath: Directory by extra {
// val file = rootPackageJson.rootPackageJson.parentFile.normalize()
// logger.lifecycle("Kotlin/JS NODE_PATH: $file")
// project.layout.dir(provider { file }).get()
//}
//
//val nodeModulesDir: Directory by extra {
// val file = nodePath.dir(NpmProject.NODE_MODULES)
// logger.lifecycle("Kotlin/JS NODE_MODULES: $file")
// file
//}
// build/js/node_modules/ts-proto/node_modules/.bin
//
tasks.register<ProtobufCompileTask>("protobufJava") {
description = "proto2java"
protoFile.set(file("$projectDir/src/proto/FactorioServerLogRecord.proto"))
cliArgs.add("--java_out=lite:${project.mkdir("$temporaryDir/java").canonicalPath}")
} }
tasks.create<ProtobufCompileTask>("protobufKotlin") {
description = "proto2kotlin"
protoFile.set(file("$projectDir/src/proto/FactorioServerLogRecord.proto"))
cliArgs.add("--kotlin_out=lite:${project.mkdir("$temporaryDir/kotlin").canonicalPath}") val rootPackageJson by rootProject.tasks.getting(RootPackageJsonTask::class)
val nodePath: Directory by extra {
val file = rootPackageJson.rootPackageJson.parentFile.normalize()
logger.lifecycle("Kotlin/JS NODE_PATH: $file")
project.layout.dir(provider { file }).get()
} }
tasks.create<ProtobufCompileTask>("protobufTypescript") { val nodeModulesDir: Directory by extra {
description = "proto2typescript" val file = nodePath.dir(NpmProject.NODE_MODULES)
logger.lifecycle("Kotlin/JS NODE_MODULES: $file")
file
}
// linux: afterEvaluate {
tasks.register<ProtobufCompileTask>("protobufJava") {
description = "proto2java"
protoFile.set(file("$projectDir/src/proto/FactorioServerLogRecord.proto"))
cliArgs.add("--java_out=lite:${project.mkdir("$temporaryDir/java").canonicalPath}")
}
tasks.register<ProtobufCompileTask>("protobufKotlin") {
description = "proto2kotlin"
protoFile.set(file("$projectDir/src/proto/FactorioServerLogRecord.proto"))
cliArgs.add("--kotlin_out=lite:${project.mkdir("$temporaryDir/kotlin").canonicalPath}")
}
tasks.register<ProtobufCompileTask>("protobufTypescript") {
description = "proto2typescript"
this.taskDependencies
// linux:
// cliArgs.add("--plugin=${rootProject.buildDir}/js/packages/factorio-web-map-factorio-events-data-model/node_modules/.bin/protoc-gen-ts_proto.cmd") // cliArgs.add("--plugin=${rootProject.buildDir}/js/packages/factorio-web-map-factorio-events-data-model/node_modules/.bin/protoc-gen-ts_proto.cmd")
// windows: // windows:
cliArgs.add("--plugin=protoc-gen-ts_proto=${rootProject.buildDir}/js/packages/factorio-web-map-factorio-events-data-model/node_modules/.bin/protoc-gen-ts_proto.cmd") cliArgs.add("--plugin=protoc-gen-ts_proto=${rootProject.buildDir}/js/packages/factorio-web-map-factorio-events-data-model/node_modules/.bin/protoc-gen-ts_proto.cmd")
cliArgs.add("--ts_proto_out=${project.mkdir("$temporaryDir/typescript").canonicalPath}") cliArgs.add("--ts_proto_out=${project.mkdir("$temporaryDir/typescript").canonicalPath}")
cliArgs.addAll( cliArgs.addAll(
"--ts_proto_opt=useOptionals=true", "--ts_proto_opt=useOptionals=true",
"--ts_proto_opt=outputServices=false", "--ts_proto_opt=outputServices=false",
"--ts_proto_opt=outputJsonMethods=false", "--ts_proto_opt=outputJsonMethods=false",
"--ts_proto_opt=outputEncodeMethods=false", "--ts_proto_opt=outputEncodeMethods=false",
"--ts_proto_opt=forceLong=string", "--ts_proto_opt=forceLong=string",
"--ts_proto_opt=forceLong=number", "--ts_proto_opt=forceLong=number",
"--ts_proto_opt=esModuleInterop=true", "--ts_proto_opt=esModuleInterop=true",
"--ts_proto_opt=exportCommonSymbols=false", "--ts_proto_opt=exportCommonSymbols=false",
// "--proto_path=${rootProject.rootDir}", // "--proto_path=${rootProject.rootDir}",
) )
protoFile.set(file("$projectDir/src/proto/FactorioServerLogRecord.proto")) protoFile.set(file("$projectDir/src/proto/FactorioServerLogRecord.proto"))
}
} }