From 96d8ceda2c3dcdccaa030060862049ec81ece073 Mon Sep 17 00:00:00 2001 From: Adam <897017+asemy@users.noreply.github.com> Date: Wed, 3 Nov 2021 09:48:30 +0100 Subject: [PATCH] jvm+kt+ts code gen working --- buildSrc/build.gradle.kts | 5 + ...KotlinMultiplatformProjectConfiguration.kt | 8 +- .../adamko/gradle/pbandg/pb-and-g.gradle.kts | 51 ++--- .../build.gradle.kts | 182 ++++++++---------- 4 files changed, 108 insertions(+), 138 deletions(-) diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index dba2d23..1c9ab46 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -24,6 +24,11 @@ dependencies { } tasks.withType().configureEach { + + kotlinOptions { + jvmTarget = "11" + } + kotlinOptions.freeCompilerArgs += listOf( "-Xopt-in=kotlin.OptIn", "-Xopt-in=kotlin.ExperimentalStdlibApi", diff --git a/buildSrc/src/main/kotlin/dev/adamko/gradle/pbandg/pattern/KotlinMultiplatformProjectConfiguration.kt b/buildSrc/src/main/kotlin/dev/adamko/gradle/pbandg/pattern/KotlinMultiplatformProjectConfiguration.kt index a28809f..99b5f4d 100644 --- a/buildSrc/src/main/kotlin/dev/adamko/gradle/pbandg/pattern/KotlinMultiplatformProjectConfiguration.kt +++ b/buildSrc/src/main/kotlin/dev/adamko/gradle/pbandg/pattern/KotlinMultiplatformProjectConfiguration.kt @@ -10,7 +10,7 @@ class KotlinMultiplatformProjectConfiguration : Plugin { override fun apply(project: Project) { project.afterEvaluate { - addSourceSets(this) + addSourceSets(project) } } @@ -19,10 +19,6 @@ class KotlinMultiplatformProjectConfiguration : Plugin { project.extensions.findByType()?.apply { 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 { kotlin.srcDir(project.layout.pbAndGBuildDir.get().dir("generated-sources/java")) @@ -55,7 +51,7 @@ class KotlinMultiplatformProjectConfiguration : Plugin { // // targets .forEach { // when (it.platformType){ -// KotlinPlatformType.jvm -> TODO() +// KotlinPlatformType.jvm -> {} // KotlinPlatformType.js -> { // it.defaultConfigurationName // } diff --git a/buildSrc/src/main/kotlin/dev/adamko/gradle/pbandg/pb-and-g.gradle.kts b/buildSrc/src/main/kotlin/dev/adamko/gradle/pbandg/pb-and-g.gradle.kts index 2c3132b..a19e654 100644 --- a/buildSrc/src/main/kotlin/dev/adamko/gradle/pbandg/pb-and-g.gradle.kts +++ b/buildSrc/src/main/kotlin/dev/adamko/gradle/pbandg/pb-and-g.gradle.kts @@ -1,8 +1,6 @@ package dev.adamko.gradle.pbandg 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.task.ProtobufCompileTask import dev.adamko.gradle.pbandg.task.ProtobufPrepareLibrariesTask @@ -19,21 +17,21 @@ plugins { // IntelliJPattern().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) -} +//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 = project.extensions.create(Constants.PBG_SETTINGS_NAME, PBAndGSettings::class, project) //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" isVisible = false isCanBeConsumed = false @@ -53,14 +51,10 @@ val protobufLibraryDependencies: Configuration = isTransitive = false } - project.dependencies { - 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") -// 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") + protobufLibraryDependencies("com.google.protobuf:protobuf-javalite:3.19.1") { + because("This dep contains common Google .proto files that will be extracted") + } } val protobufPrepareLibrariesTask = @@ -73,7 +67,7 @@ project.tasks.withType { protobufLibraryDirectories.add(protobufPrepareLibrariesTask.flatMap { it.librariesDirectory }) val exe = protocDep.singleFile - logger.lifecycle("protoc.exe: $exe") + logger.debug("Configuring Protobuf task with protoc.exe: $exe") protocExecutable.set(exe) } @@ -84,18 +78,11 @@ val aggregateTask = project.tasks.register("protobufCompileAll") { val genSrcDir = project.layout.pbAndGBuildDir.map { it.dir("generated-sources") } - val pbCompileTasks = tasks.withType() - from(pbCompileTasks.map { it.temporaryDir }) - into(genSrcDir) - includeEmptyDirs = false + val pbCompileTasks = tasks.withType() + from(pbCompileTasks.map { it.temporaryDir }) + into(genSrcDir) + includeEmptyDirs = false } -//project.tasks.assemble { dependsOn(aggregateTask) } - - -///** Convert `.proto` files to Kotlin */ -//val pbCompileTask = project.tasks.create("protobufJava") { -// protocOutputs += KotlinOutput() -// protocOutputs += JavaOutput() -//} +project.tasks.assemble { dependsOn(aggregateTask) } diff --git a/modules/factorio-events-data-model/build.gradle.kts b/modules/factorio-events-data-model/build.gradle.kts index eefa406..04727f0 100644 --- a/modules/factorio-events-data-model/build.gradle.kts +++ b/modules/factorio-events-data-model/build.gradle.kts @@ -1,46 +1,18 @@ import dev.adamko.gradle.pbandg.task.ProtobufCompileTask -//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.NpmProject +import org.jetbrains.kotlin.gradle.targets.js.npm.tasks.RootPackageJsonTask plugins { id("dev.adamko.factoriowebmap.archetype.base") kotlin("multiplatform") -// id("dev.adamko.factoriowebmap.archetype.kotlin-jvm") id("dev.adamko.gradle.pbandg.pb-and-g") } val projectId: String by project.extra 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 { -// 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 -// } -// } - - // -// sourceSets { -// val proto by creating { -// } -// } - // // jvm { @@ -51,21 +23,6 @@ kotlin { } } - // - - // -// js(IR) { -// binaries.executable() -//// browser { -////// commonWebpackConfig { -////// cssSupport.enabled = true -////// } -//// } -// -// useCommonJs() -// nodejs() -// -// } sourceSets { val jvmMain by getting { @@ -76,76 +33,101 @@ kotlin { } val jvmTest by getting { } + } -// val jsMain by getting { -// dependencies { -// implementation(npm("ts-proto", "1.83.3")) -// } -// } -// -// val jsTest by getting { -// dependencies { -// implementation(kotlin("test-js")) -// } -// } + // + + // + js(IR) { + browser() + } + + sourceSets { + val jsMain by getting { + dependencies { + implementation(npm("ts-proto", "1.83.3")) + } + } + + val jsTest by getting { + dependencies { + implementation(kotlin("test-js")) + } + } } // + 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().configureEach { -//} - -//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("protobufJava") { - description = "proto2java" - protoFile.set(file("$projectDir/src/proto/FactorioServerLogRecord.proto")) - - cliArgs.add("--java_out=lite:${project.mkdir("$temporaryDir/java").canonicalPath}") +dependencies { + protobufLibrary("com.google.protobuf:protobuf-javalite:3.19.1") } -tasks.create("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("protobufTypescript") { - description = "proto2typescript" +val nodeModulesDir: Directory by extra { + val file = nodePath.dir(NpmProject.NODE_MODULES) + logger.lifecycle("Kotlin/JS NODE_MODULES: $file") + file +} - // linux: +afterEvaluate { + tasks.register("protobufJava") { + description = "proto2java" + protoFile.set(file("$projectDir/src/proto/FactorioServerLogRecord.proto")) + + cliArgs.add("--java_out=lite:${project.mkdir("$temporaryDir/java").canonicalPath}") + } + + tasks.register("protobufKotlin") { + description = "proto2kotlin" + protoFile.set(file("$projectDir/src/proto/FactorioServerLogRecord.proto")) + + cliArgs.add("--kotlin_out=lite:${project.mkdir("$temporaryDir/kotlin").canonicalPath}") + } + + tasks.register("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") - // 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") + // 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("--ts_proto_out=${project.mkdir("$temporaryDir/typescript").canonicalPath}") + cliArgs.add("--ts_proto_out=${project.mkdir("$temporaryDir/typescript").canonicalPath}") - cliArgs.addAll( - "--ts_proto_opt=useOptionals=true", - "--ts_proto_opt=outputServices=false", - "--ts_proto_opt=outputJsonMethods=false", - "--ts_proto_opt=outputEncodeMethods=false", - "--ts_proto_opt=forceLong=string", - "--ts_proto_opt=forceLong=number", - "--ts_proto_opt=esModuleInterop=true", - "--ts_proto_opt=exportCommonSymbols=false", + cliArgs.addAll( + "--ts_proto_opt=useOptionals=true", + "--ts_proto_opt=outputServices=false", + "--ts_proto_opt=outputJsonMethods=false", + "--ts_proto_opt=outputEncodeMethods=false", + "--ts_proto_opt=forceLong=string", + "--ts_proto_opt=forceLong=number", + "--ts_proto_opt=esModuleInterop=true", + "--ts_proto_opt=exportCommonSymbols=false", // "--proto_path=${rootProject.rootDir}", - ) + ) - protoFile.set(file("$projectDir/src/proto/FactorioServerLogRecord.proto")) + protoFile.set(file("$projectDir/src/proto/FactorioServerLogRecord.proto")) + } }