0

I'm new to writing plugins for gradle and am following the examples here:

https://docs.gradle.org/current/userguide/structuring_software_products.html

Under "build-logic/commons/src/main/groovy" there are gradle files which I want to pass a value to for when the file is compiled and a value for when the plugin is being run. How do you do this?

So here is the sample code:

plugins {
    id('java')
}

group = 'com.example.myproduct'

dependencies {
    implementation(platform("com.example.platform:product-platform:${build_version}"))

    testImplementation(platform("com.example.platform:test-platform:${run_version}"))
}

The idea is to specify the value ${build_version} when the "groovy-gradle-plugin" is being run (so the value is compiled into the plugin) and allow the ${run_version} to be specified when the generated plugin is run.

It's not clear to me how to set either of these values (even after lots of searching). Also, as a note, if I hard code values in, the generated plugin works as expected.

I have tried using

ext {
  build_version = "1.0"
}

but nothing seems to work

codex70
  • 1
  • 2
  • Have you tried something like this answer? https://stackoverflow.com/questions/66127049/how-do-you-access-gradle-ext-properties-in-plugin-java-source-code – User51 Jun 27 '23 at 12:58
  • @User51, you were right, I'll put the solution below. – codex70 Jun 27 '23 at 15:08

1 Answers1

0

Following on from the comment by @User51, I needed to add the following to settings.gradle in the application which uses the plugin (this is important as it can't be set before the plugins in the build file):

gradle.ext.myProp = "overrideValue"

Then my plugin:

plugins {
    id('java')
}

String myProp = (String) project.getRootProject().getProperties().getOrDefault("myProp", null);
Gradle gradle = project.getRootProject().getGradle();
if ((myProp == null)  && (gradle instanceof ExtensionAware)) {
    ExtensionAware gradleExtensions = (ExtensionAware) gradle;
    myProp = (String) gradleExtensions.getExtensions().getExtraProperties().get("myProp");
}
System.out.println("myProp=" + myProp)

group = 'com.example.myproduct'

dependencies {
    implementation(platform("com.example.platform:product-platform:${myProp}"))
}

Important to note here is the ordering again. We need to define myProp after the plugin block, but before it is used in the dependencies section.

codex70
  • 1
  • 2