Skip to content

Commit 6120515

Browse files
committed
gradle plugin works (TM)
1 parent b42e7cf commit 6120515

File tree

3 files changed

+45
-39
lines changed

3 files changed

+45
-39
lines changed

dataconnect/buildSrc/src/main/kotlin/com/google/firebase/example/dataconnect/gradle/DataConnectGradlePlugin.kt

Lines changed: 29 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -18,35 +18,51 @@ package com.google.firebase.example.dataconnect.gradle
1818

1919
import com.android.build.api.variant.ApplicationAndroidComponentsExtension
2020
import com.android.build.api.variant.ApplicationVariant
21+
import java.util.Locale
2122
import org.gradle.api.Plugin
2223
import org.gradle.api.Project
24+
import org.gradle.api.file.Directory
25+
import org.gradle.api.file.RegularFile
26+
import org.gradle.api.provider.Provider
2327
import org.gradle.kotlin.dsl.getByType
2428
import org.gradle.kotlin.dsl.register
25-
import java.util.Locale
2629

2730
@Suppress("unused")
2831
abstract class DataConnectGradlePlugin : Plugin<Project> {
2932

3033
override fun apply(project: Project) {
34+
val buildDirectory = project.layout.buildDirectory.dir("dataconnect")
35+
36+
val setupFirebaseToolsTask = project.tasks.register<SetupFirebaseToolsTask>("setupFirebaseToolsForDataConnect") {
37+
version.set("13.23.0")
38+
outputDirectory.set(buildDirectory.map { it.dir("firebase-tools") })
39+
}
40+
val firebaseExecutable = setupFirebaseToolsTask.flatMap { it.firebaseExecutable }
41+
3142
val androidComponents = project.extensions.getByType<ApplicationAndroidComponentsExtension>()
32-
androidComponents.onVariants {
33-
this@DataConnectGradlePlugin.registerTasks(project, it)
43+
androidComponents.onVariants { variant ->
44+
val variantBuildDirectory = buildDirectory.map { it.dir("variants/${variant.name}") }
45+
this@DataConnectGradlePlugin.registerVariantTasks(
46+
project=project,
47+
variant=variant,
48+
buildDirectoryProvider=variantBuildDirectory,
49+
firebaseExecutableProvider=firebaseExecutable,
50+
)
3451
}
3552
}
3653

37-
private fun registerTasks(project: Project, variant: ApplicationVariant) {
54+
private fun registerVariantTasks(
55+
project: Project,
56+
variant: ApplicationVariant,
57+
buildDirectoryProvider: Provider<Directory>,
58+
firebaseExecutableProvider: Provider<RegularFile>,
59+
) {
3860
val variantNameTitleCase = variant.name.replaceFirstChar { it.titlecase(Locale.US) }
39-
val buildDirectory = project.layout.buildDirectory.dir("dataconnect/${variant.name}")
40-
41-
val setupFirebaseToolsTask = project.tasks.register<SetupFirebaseToolsTask>("setupFirebaseTools$variantNameTitleCase") {
42-
version.set("13.23.0")
43-
outputDirectory.set(buildDirectory.map { it.dir("firebase-tools") })
44-
}
4561

46-
val generateCodeTask = project.tasks.register<GenerateCodeTask>("generateDataConnectSources${variantNameTitleCase}") {
62+
val generateCodeTask = project.tasks.register<GenerateCodeTask>("generate${variantNameTitleCase}DataConnectSources") {
4763
inputDirectory.set(project.layout.projectDirectory.dir("../dataconnect"))
48-
firebaseExecutable.set(setupFirebaseToolsTask.flatMap { it.firebaseExecutable })
49-
workDirectory.set(buildDirectory.map { it.dir("generateCodeTaskWorkDir") })
64+
firebaseExecutable.set(firebaseExecutableProvider)
65+
tweakedConnectorsDirectory.set(buildDirectoryProvider.map { it.dir("tweakedConnectors") })
5066
}
5167

5268
variant.sources.java!!.addGeneratedSourceDirectory(

dataconnect/buildSrc/src/main/kotlin/com/google/firebase/example/dataconnect/gradle/GenerateCodeTask.kt

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -20,47 +20,48 @@ import java.io.File
2020
import org.gradle.api.DefaultTask
2121
import org.gradle.api.file.DirectoryProperty
2222
import org.gradle.api.file.RegularFileProperty
23-
import org.gradle.api.tasks.InputFiles
23+
import org.gradle.api.tasks.InputDirectory
24+
import org.gradle.api.tasks.InputFile
2425
import org.gradle.api.tasks.Internal
2526
import org.gradle.api.tasks.OutputDirectory
2627
import org.gradle.api.tasks.TaskAction
2728

2829
abstract class GenerateCodeTask : DefaultTask() {
2930

30-
@get:InputFiles
31+
@get:InputDirectory
3132
abstract val inputDirectory: DirectoryProperty
3233

33-
@get:InputFiles
34+
@get:InputFile
3435
abstract val firebaseExecutable: RegularFileProperty
3536

3637
@get:OutputDirectory
3738
abstract val outputDirectory: DirectoryProperty
3839

3940
@get:Internal
40-
abstract val workDirectory: DirectoryProperty
41+
abstract val tweakedConnectorsDirectory: DirectoryProperty
4142

4243
@TaskAction
4344
fun run() {
4445
val inputDirectory = inputDirectory.get().asFile
4546
val firebaseExecutable = firebaseExecutable.get().asFile
4647
val outputDirectory = outputDirectory.get().asFile
47-
val workDirectory = workDirectory.get().asFile
48+
val tweakedConnectorsDirectory = tweakedConnectorsDirectory.get().asFile
4849

4950
logger.info("inputDirectory: {}", inputDirectory)
5051
logger.info("firebaseExecutable: {}", firebaseExecutable)
5152
logger.info("outputDirectory: {}", outputDirectory)
52-
logger.info("workDirectory: {}", workDirectory)
53+
logger.info("tweakedConnectorsDirectory: {}", tweakedConnectorsDirectory)
5354

5455
project.delete(outputDirectory)
55-
project.delete(workDirectory)
56-
project.mkdir(workDirectory)
56+
project.delete(tweakedConnectorsDirectory)
57+
project.mkdir(tweakedConnectorsDirectory)
5758

5859
project.copy {
5960
from(inputDirectory)
60-
into(workDirectory)
61+
into(tweakedConnectorsDirectory)
6162
}
6263

63-
val connectorYamlFile = workDirectory.resolve("movie-connector/connector.yaml")
64+
val connectorYamlFile = tweakedConnectorsDirectory.resolve("movie-connector/connector.yaml")
6465
val outputFileLineRegex = Regex("""(\s*outputDir:\s*).*""")
6566
val connectorYamlOriginalLines = connectorYamlFile.readLines(Charsets.UTF_8)
6667
val connectorYamlUpdatedLines = connectorYamlOriginalLines.map {
@@ -81,7 +82,7 @@ abstract class GenerateCodeTask : DefaultTask() {
8182
// Specify a fake project because dataconnect:sdk:generate unnecessarily
8283
// requires one. The actual value does not matter.
8384
args("--project", "zzyzx")
84-
workingDir(workDirectory)
85+
workingDir(tweakedConnectorsDirectory)
8586
isIgnoreExitValue = false
8687
if (logStream !== null) {
8788
standardOutput = logStream

dataconnect/buildSrc/src/main/kotlin/com/google/firebase/example/dataconnect/gradle/SetupFirebaseToolsTask.kt

Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@ import org.gradle.api.file.RegularFile
2323
import org.gradle.api.provider.Property
2424
import org.gradle.api.provider.Provider
2525
import org.gradle.api.tasks.Input
26+
import org.gradle.api.tasks.Internal
2627
import org.gradle.api.tasks.OutputDirectory
27-
import org.gradle.api.tasks.OutputFile
2828
import org.gradle.api.tasks.TaskAction
2929

3030
abstract class SetupFirebaseToolsTask : DefaultTask() {
@@ -35,20 +35,17 @@ abstract class SetupFirebaseToolsTask : DefaultTask() {
3535
@get:OutputDirectory
3636
abstract val outputDirectory: DirectoryProperty
3737

38-
@get:OutputFile
39-
val firebaseExecutable: Provider<RegularFile> = project.providers.provider {
40-
outputDirectory.file("node_modules/.bin/firebase").get()
41-
}
38+
@get:Internal
39+
val firebaseExecutable: Provider<RegularFile> get() =
40+
outputDirectory.map { it.file("node_modules/.bin/firebase") }
4241

4342
@TaskAction
4443
fun run() {
4544
val version: String = version.get()
4645
val outputDirectory: File = outputDirectory.get().asFile
47-
val firebaseExecutable: File = firebaseExecutable.get().asFile
4846

4947
logger.info("version: {}", version)
5048
logger.info("outputDirectory: {}", outputDirectory.absolutePath)
51-
logger.info("firebaseExecutable: {}", firebaseExecutable.absolutePath)
5249

5350
project.delete(outputDirectory)
5451
project.mkdir(outputDirectory)
@@ -74,13 +71,5 @@ abstract class SetupFirebaseToolsTask : DefaultTask() {
7471
npmInstallLogFile?.let { logger.warn("{}", it.readText()) }
7572
throw exception
7673
}
77-
78-
if (!firebaseExecutable.exists()) {
79-
throw SetupFirebaseToolsTaskException("npm install was expected to create the file " +
80-
"${firebaseExecutable.absolutePath}, but it does not exist " +
81-
"(error code mr7dwmhwtv)")
82-
}
8374
}
84-
85-
class SetupFirebaseToolsTaskException(message: String): Exception(message)
8675
}

0 commit comments

Comments
 (0)