Stealth Rabbi
Stealth Rabbi

Reputation: 10346

How to reference a subproject dir from a root gradle task when calling task from subproject

I have a root project gradle task defined below. I am

task createVersionTxtResourceFile {
    doLast {
        def webAppVersionFile = new File("$projectDir/src/main/resources/VERSION.txt")
        def appVersion = project.ext.$full_version

        println "writing VERSION.txt to " + webAppVersionFile + ", containing " + appVersion
        webAppVersionFile.delete()
        webAppVersionFile.write(appVersion)
    }
}

In a few subprojects, I want to run this task and create the VERSION.txt file in the subproject's src/main/resources/VERSION.txt. My problem is that the root level task's $projectDir is the root project.

Is it possible to define a root level task that uses the sub-project directory when invoking it? Or perhaps there's a better approach all together.

Upvotes: 0

Views: 672

Answers (2)

Larusso
Larusso

Reputation: 1151

You could do it slightly more controlled when you register an action to wait for the java plugin to be applied on the subproject. With this you can create the task only in subprojects who contain the desired compileJava task and configure everything from the root project.

subprojects { sub ->
    //register an action which gets executed when the java plugins gets applied.
    //if the project is already configured with the java plugin
    //then this action gets executed right away.
    sub.plugins.withId("java") {
      //create the task and save it.
      def createVersionTxtResourceFile = sub.tasks.create("createVersionTxtResourceFile") {
          doLast {
              def webAppVersionFile = new File("${sub.projectDir}/src/main/resources/VERSION.txt")
              def appVersion = rootProject.full_version

              println "writing VERSION.txt to " + webAppVersionFile + ", containing " + appVersion
              webAppVersionFile.delete()
              webAppVersionFile.write(appVersion)
          }
      }
      // set the task dependency
      sub.tasks.compileJava.dependsOn createVersionTxtResourceFile
    }
}

Upvotes: 1

Stealth Rabbi
Stealth Rabbi

Reputation: 10346

I ended up just defining the task in each subproject, and setting a dependency on it in the appropriate subprojects:

subprojects {

    task createVersionTxtResourceFile {
        doLast {
            def webAppVersionFile = new File("$projectDir/src/main/resources/VERSION.txt")
            def appVersion = rootProject.full_version

            println "writing VERSION.txt to " + webAppVersionFile + ", containing " + appVersion
            webAppVersionFile.delete()
            webAppVersionFile.write(appVersion)
        }
    }
}

then in a subproject build.gradle:

compileJava.dependsOn createVersionTxtResourceFile

Upvotes: 0

Related Questions