kotlin gen working (again!), and source sets working
This commit is contained in:
parent
cb205c558b
commit
31ae0c9800
5 changed files with 132 additions and 41 deletions
|
|
@ -27,3 +27,5 @@ to investigate:
|
||||||
* https://github.com/cloudhut/kowl
|
* https://github.com/cloudhut/kowl
|
||||||
* https://opensource.expediagroup.com/graphql-kotlin/docs/server/spring-server/spring-subscriptions
|
* https://opensource.expediagroup.com/graphql-kotlin/docs/server/spring-server/spring-subscriptions
|
||||||
* https://github.com/YousefED/typescript-json-schema
|
* https://github.com/YousefED/typescript-json-schema
|
||||||
|
|
||||||
|
* https://jbrandhorst.com/post/go-protobuf-tips/
|
||||||
|
|
@ -1,4 +1,5 @@
|
||||||
plugins {
|
plugins {
|
||||||
|
idea
|
||||||
base
|
base
|
||||||
|
|
||||||
// val kotlinVersion = "1.5.31"
|
// val kotlinVersion = "1.5.31"
|
||||||
|
|
@ -16,3 +17,10 @@ tasks.wrapper {
|
||||||
gradleVersion = "7.2"
|
gradleVersion = "7.2"
|
||||||
distributionType = Wrapper.DistributionType.ALL
|
distributionType = Wrapper.DistributionType.ALL
|
||||||
}
|
}
|
||||||
|
|
||||||
|
idea {
|
||||||
|
module {
|
||||||
|
isDownloadSources = true
|
||||||
|
isDownloadJavadoc = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
package dev.adamko.factoriowebmap.archetype
|
package dev.adamko.factoriowebmap.archetype
|
||||||
|
|
||||||
plugins {
|
plugins {
|
||||||
|
idea
|
||||||
base
|
base
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -18,6 +19,12 @@ val tokens: Map<String, String> by extra(
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
idea {
|
||||||
|
module {
|
||||||
|
isDownloadSources = true
|
||||||
|
isDownloadJavadoc = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//group = "dev.adamko.factoriowebmap"
|
//group = "dev.adamko.factoriowebmap"
|
||||||
//version = "0.0.1"
|
//version = "0.0.1"
|
||||||
|
|
|
||||||
|
|
@ -12,6 +12,7 @@ import org.jetbrains.kotlin.gradle.targets.js.npm.NpmProject
|
||||||
|
|
||||||
plugins {
|
plugins {
|
||||||
kotlin("js")
|
kotlin("js")
|
||||||
|
id("dev.adamko.factoriowebmap.archetype.base")
|
||||||
id("dev.adamko.factoriowebmap.archetype.node")
|
id("dev.adamko.factoriowebmap.archetype.node")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -4,15 +4,18 @@ import org.gradle.api.Plugin
|
||||||
import org.gradle.api.Project
|
import org.gradle.api.Project
|
||||||
import org.gradle.api.provider.Property
|
import org.gradle.api.provider.Property
|
||||||
import org.gradle.api.tasks.TaskAction
|
import org.gradle.api.tasks.TaskAction
|
||||||
|
import org.gradle.kotlin.dsl.provideDelegate
|
||||||
|
import org.gradle.kotlin.dsl.configure
|
||||||
import org.gradle.kotlin.dsl.create
|
import org.gradle.kotlin.dsl.create
|
||||||
import org.gradle.kotlin.dsl.property
|
import org.gradle.kotlin.dsl.property
|
||||||
import org.gradle.nativeplatform.platform.internal.DefaultNativePlatform
|
import org.gradle.nativeplatform.platform.internal.DefaultNativePlatform
|
||||||
import org.gradle.nativeplatform.platform.internal.DefaultOperatingSystem
|
import org.gradle.nativeplatform.platform.internal.DefaultOperatingSystem
|
||||||
import org.jetbrains.kotlin.incremental.isJavaFile
|
import org.gradle.plugins.ide.idea.model.IdeaModel
|
||||||
|
import org.jetbrains.kotlin.gradle.dsl.KotlinJvmProjectExtension
|
||||||
import org.jetbrains.kotlin.util.parseSpaceSeparatedArgs
|
import org.jetbrains.kotlin.util.parseSpaceSeparatedArgs
|
||||||
|
|
||||||
plugins {
|
plugins {
|
||||||
id("dev.adamko.factoriowebmap.archetype.base")
|
id("dev.adamko.factoriowebmap.archetype.kotlin-jvm")
|
||||||
`kotlin-dsl`
|
`kotlin-dsl`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -28,6 +31,8 @@ open class ProtocPlugin : Plugin<Project> {
|
||||||
|
|
||||||
override fun apply(project: Project) {
|
override fun apply(project: Project) {
|
||||||
|
|
||||||
|
configureIntelliJ(project)
|
||||||
|
|
||||||
val protocConfig =
|
val protocConfig =
|
||||||
project.extensions.create("protocPluginConfig", ProtocPluginConfig::class, project)
|
project.extensions.create("protocPluginConfig", ProtocPluginConfig::class, project)
|
||||||
|
|
||||||
|
|
@ -42,29 +47,29 @@ open class ProtocPlugin : Plugin<Project> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
val protobufLibs: Configuration = project.configurations.create("protobufLib") {
|
val protobufLib: Configuration = project.configurations.create("protobufLib") {
|
||||||
isVisible = true
|
isVisible = true
|
||||||
isCanBeConsumed = false
|
isCanBeConsumed = false
|
||||||
isCanBeResolved = true
|
isCanBeResolved = true
|
||||||
isTransitive = false
|
isTransitive = false
|
||||||
}
|
}
|
||||||
|
|
||||||
// val protocPrepare = project.tasks.register<ProtocPrepareTask>("protocPrepare")
|
|
||||||
|
|
||||||
project.dependencies {
|
project.dependencies {
|
||||||
protobufLibs("com.google.protobuf:protobuf-javalite:3.19.1")
|
protobufLib("com.google.protobuf:protobuf-javalite:3.19.1")
|
||||||
}
|
}
|
||||||
|
|
||||||
val libsTask = project.tasks.register<Sync>("protobufLibs") {
|
/** Download protobuf libs */
|
||||||
|
val protoLibsTask = project.tasks.register<Sync>("protobufLibs") {
|
||||||
group = "protobuf"
|
group = "protobuf"
|
||||||
|
description = "Download and extract protobuf libs"
|
||||||
includeEmptyDirs = false
|
includeEmptyDirs = false
|
||||||
|
dependsOn(protobufLib)
|
||||||
|
|
||||||
dependsOn(protobufLibs)
|
val protoLibDir by project.objects.directoryProperty()
|
||||||
|
.convention(project.layout.buildDirectory.dir("protobuf/libs"))
|
||||||
|
into(protoLibDir)
|
||||||
|
|
||||||
val outDir = project.layout.buildDirectory.dir("proto/libs")
|
protobufLib
|
||||||
|
|
||||||
protobufLibs
|
|
||||||
.map { project.zipTree(it) }
|
.map { project.zipTree(it) }
|
||||||
.forEach {
|
.forEach {
|
||||||
logger.lifecycle("protoc lib - $it")
|
logger.lifecycle("protoc lib - $it")
|
||||||
|
|
@ -72,50 +77,60 @@ open class ProtocPlugin : Plugin<Project> {
|
||||||
include("**/*.proto")
|
include("**/*.proto")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
into(outDir)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO investigate builtBy and sourceDirectorySet?
|
||||||
|
// project.objects.fileCollection().builtBy()
|
||||||
|
// val pbSrcSet = project.objects.sourceDirectorySet("protobuf", "protobuf")
|
||||||
|
|
||||||
project.tasks.register<Exec>("protobufCompile") {
|
|
||||||
|
/** Convert `.proto` files to Kotlin */
|
||||||
|
val pbCompileTask = project.tasks.register<Exec>("protobufCompile") {
|
||||||
group = "protobuf"
|
group = "protobuf"
|
||||||
dependsOn(protobufCompiler, libsTask)
|
dependsOn(protobufCompiler, protoLibsTask)
|
||||||
executable(protobufCompiler.singleFile)
|
|
||||||
|
|
||||||
val protoLibsDir = project.layout.buildDirectory.dir("proto/libs")
|
|
||||||
inputs.dir(protoLibsDir)
|
|
||||||
|
|
||||||
standardOutput = System.out
|
standardOutput = System.out
|
||||||
|
|
||||||
val outDir = project.layout.buildDirectory.dir("protoc/generated-sources")
|
executable(protobufCompiler.singleFile)
|
||||||
outputs.dir(outDir)
|
|
||||||
|
|
||||||
workingDir(temporaryDirFactory)
|
workingDir(temporaryDirFactory)
|
||||||
|
|
||||||
val javaOut = workingDir.resolve("proto/java")
|
val outDir = project.layout.buildDirectory.dir("protobuf/generated-sources")
|
||||||
val kotlinOut = workingDir.resolve("proto/kotlin")
|
outputs.dir(outDir)
|
||||||
|
|
||||||
|
val protoLibsDir: Provider<File> = protoLibsTask.map { it.destinationDir }
|
||||||
|
|
||||||
|
val javaOut = workingDir.resolve("java")
|
||||||
|
val kotlinOut = workingDir.resolve("kotlin")
|
||||||
val protoFile by project.objects.fileProperty()
|
val protoFile by project.objects.fileProperty()
|
||||||
.convention(project.layout.projectDirectory.file("src/main/proto/FactorioServerLogRecord.proto"))
|
.convention(project.layout.projectDirectory.file("src/main/proto/FactorioServerLogRecord.proto"))
|
||||||
|
|
||||||
val protoFileParent = project.provider { protoFile.asFile.parentFile }
|
val protoFileParent = project.provider { protoFile.asFile.parentFile }
|
||||||
|
|
||||||
inputs.file(protoFile)
|
val isLiteEnabled: Boolean by project.objects.property<Boolean>().convention(true)
|
||||||
|
|
||||||
args(
|
|
||||||
parseSpaceSeparatedArgs(
|
|
||||||
"""
|
|
||||||
--proto_path=${protoFileParent.get()}
|
|
||||||
--proto_path=${protoLibsDir.get()}
|
|
||||||
--java_out=$javaOut
|
|
||||||
--kotlin_out=$kotlinOut
|
|
||||||
$protoFile
|
|
||||||
"""
|
|
||||||
)
|
|
||||||
)
|
|
||||||
doFirst {
|
doFirst {
|
||||||
project.delete(workingDir)
|
project.delete(workingDir)
|
||||||
|
|
||||||
|
project.mkdir(outDir)
|
||||||
project.mkdir(javaOut)
|
project.mkdir(javaOut)
|
||||||
project.mkdir(kotlinOut)
|
project.mkdir(kotlinOut)
|
||||||
|
|
||||||
|
val liteOpt: String = when (isLiteEnabled) {
|
||||||
|
true -> "lite:"
|
||||||
|
false -> ""
|
||||||
|
}
|
||||||
|
|
||||||
|
args(
|
||||||
|
parseSpaceSeparatedArgs(
|
||||||
|
"""
|
||||||
|
--proto_path=${protoLibsDir.get()}
|
||||||
|
--proto_path=${protoFileParent.get()}
|
||||||
|
--java_out=$liteOpt$javaOut
|
||||||
|
--kotlin_out=$liteOpt$kotlinOut
|
||||||
|
$protoFile
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
doLast {
|
doLast {
|
||||||
|
|
@ -125,13 +140,55 @@ open class ProtocPlugin : Plugin<Project> {
|
||||||
}
|
}
|
||||||
project.delete(workingDir)
|
project.delete(workingDir)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
project.tasks.assemble { dependsOn(pbCompileTask) }
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Setup source dirs */
|
||||||
|
private fun configureIntelliJ(project: Project) {
|
||||||
|
|
||||||
|
val genSrcDir = project.layout.buildDirectory.dir("protobuf/generated-sources")
|
||||||
|
val ktGenSrc = genSrcDir.map { it.dir("kotlin") }
|
||||||
|
|
||||||
|
project.mkdir(ktGenSrc)
|
||||||
|
|
||||||
|
project.extensions.findByType<KotlinJvmProjectExtension>()?.apply {
|
||||||
|
project.logger.lifecycle("-------\nadding generated sources $ktGenSrc\n-------")
|
||||||
|
|
||||||
|
project.sourceSets.named("main") {
|
||||||
|
this.java.srcDir(ktGenSrc)
|
||||||
|
}
|
||||||
|
|
||||||
|
// sourceSets.main.get().kotlin.srcDir(ktGenSrc)
|
||||||
|
|
||||||
|
// sourceSets.main.configure {
|
||||||
|
// this.kotlin.srcDir(ktGenSrc)
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
|
||||||
|
project.plugins.withType<IdeaPlugin> {
|
||||||
|
project.extensions.configure<IdeaModel> {
|
||||||
|
this.module.generatedSourceDirs.add(ktGenSrc.get().asFile)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* IntelliJ requires source dirs are configured first.
|
||||||
|
*
|
||||||
|
* https://github.com/google/protobuf-gradle-plugin/blob/master/src/main/groovy/com/google/protobuf/gradle/Utils.groovy#L128
|
||||||
|
*/
|
||||||
|
project.tasks.withType<GenerateIdeaModule> {
|
||||||
|
doFirst {
|
||||||
|
project.mkdir(ktGenSrc)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
abstract class ProtocPluginConfig(private val project: Project) :
|
abstract class ProtocPluginConfig(private val project: Project) {
|
||||||
java.io.Serializable { // TODO remove serializable?
|
|
||||||
|
|
||||||
val protocWorkingDir: DirectoryProperty =
|
val protocWorkingDir: DirectoryProperty =
|
||||||
project.objects.directoryProperty()
|
project.objects.directoryProperty()
|
||||||
|
|
@ -222,7 +279,6 @@ abstract class ProtocPluginConfig(private val project: Project) :
|
||||||
|
|
||||||
abstract class ProtocPrepareTask : DefaultTask() {
|
abstract class ProtocPrepareTask : DefaultTask() {
|
||||||
|
|
||||||
|
|
||||||
@Internal
|
@Internal
|
||||||
val protocPluginConfig: Provider<ProtocPluginConfig> = project.provider {
|
val protocPluginConfig: Provider<ProtocPluginConfig> = project.provider {
|
||||||
project.extensions.getByType<ProtocPluginConfig>()
|
project.extensions.getByType<ProtocPluginConfig>()
|
||||||
|
|
@ -280,9 +336,26 @@ abstract class ProtocGenerationTask : DefaultTask() {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
apply<ProtocPlugin>()
|
apply<ProtocPlugin>()
|
||||||
|
|
||||||
configure<ProtocPluginConfig> {
|
configure<ProtocPluginConfig> {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
val logSS = tasks.create("logSourceSets") {
|
||||||
|
group = "protobuf"
|
||||||
|
|
||||||
|
doLast {
|
||||||
|
sourceSets.forEach { set ->
|
||||||
|
logger.lifecycle("SourceSet name: ${set.name}")
|
||||||
|
set.allSource.forEach { src ->
|
||||||
|
logger.lifecycle("location: ${src.toRelativeString(rootProject.projectDir)}")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
logger.lifecycle("-------\nIdeaModel generated source dirs: ${project.idea.module.generatedSourceDirs.joinToString()}\n-------")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
tasks.named("protobufCompile") { finalizedBy(logSS) }
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue