functions-framework-java icon indicating copy to clipboard operation
functions-framework-java copied to clipboard

Running a function with Gradle & Kotlin (build.gradle.kts)

Open jasperroel opened this issue 5 years ago • 3 comments

Thanks for putting all this together! I was trying to get the local invoker working on my local machine, which is setup using kotlin (1.3.72) and gradle (6.4.1) via the build.gradle.kts file.

The Gradle example in the documentation uses a format that doesn't seem compatible with the build.gradle.kts file, so I'm hoping sharing that particular configuration helps people set up their project.

build.gradle.kts

val invoker by configurations.creating

dependencies {
    implementation("com.google.cloud.functions:functions-framework-api:1.0.1")
    invoker("com.google.cloud.functions.invoker:java-function-invoker:1.0.0-alpha-2-rc5")
}

task<JavaExec>("runFunction") {
    main = "com.google.cloud.functions.invoker.runner.Invoker"
    classpath(invoker)
    inputs.files(configurations.runtimeClasspath, sourceSets["main"].output)
    args(
        "--target", project.findProperty("runFunction.target") ?: "",
        "--port", project.findProperty("runFunction.port") ?: 8080
    )
    doFirst {
        args("--classpath", files(configurations.runtimeClasspath, sourceSets["main"].output).asPath)
    }
}

Apart from the particular formatting for the .kts version, I did have to add one thing:

  • I had to add the elvis operator ?: "" for ``--target, otherwise you cannot build the project due to Illegal null value provided in this collection: [--target, null, --port, 8080]`

jasperroel avatar May 27 '20 13:05 jasperroel

@jasperroel Hey there, Where is val invoker by configurations.creating coming from? I can't resolve the example of yours because I have no idea what invoker is.

xetra11 avatar Mar 19 '21 21:03 xetra11

@xetra11 Good question, honestly don't know anymore.

My example is "just" the .kts translation of this regular build.gradle script here: https://github.com/GoogleCloudPlatform/functions-framework-java#configuration-in-buildgradle

Did you add the implementation line that imports the dependencies? implementation("com.google.cloud.functions:functions-framework-api:1.0.1") (or even 1.0.4, I see there have been some updates since then).

jasperroel avatar Apr 01 '21 12:04 jasperroel

This worked fine for me, too without specifying a new configuration. One only needs a configuration with resolve=false:

dependencies {
  implementation(Libs.gfun)
  compileOnly(Libs.gfunInvoker) // for running the function locally
}

tasks.register<JavaExec>("runFunction") {
  main = "com.google.cloud.functions.invoker.runner.Invoker"
  classpath(configurations.compileOnly)
  inputs.files(configurations.runtimeClasspath.get(), sourceSets.main.get().output)
  args(
    "--target", "<My Target class>",
    "--port", 8080 // hard-coded port
  )
  doFirst {
    args("--classpath", files(configurations.runtimeClasspath.get(), sourceSets.main.get().output).asPath)
  }
}

where Libs.gfun is "com.google.cloud.functions:functions-framework-api:1.0.4" or the latest version and Libs.gfunInvoker is "com.google.cloud.functions.invoker:java-function-invoker:1.0.2" or the latest version

i-walker avatar May 17 '21 12:05 i-walker