Chris F
Chris F

Reputation: 16673

Gradle: How to derive project directory path in a Gradle plugin?

Gradle v2.9 (Old, we're upgrading soon)

I'm trying to create a Gradle plugin by following Writing Gradle Plugins. How can I have the plugin "derive" the project's top directory, that is where build.gradle file is? if the plugin creates an hello task, I want it to do this

$ pwd
/some_path/project1
$ ls
build.gradle gradlew gradle gradle.properties src
$ ./gradlew hello
Hello /some_path/project1

Upvotes: 1

Views: 1563

Answers (1)

Chris F
Chris F

Reputation: 16673

Per the members' comments, I'm able to do this

Per the comments, I did this in the code

package org.example.greeting;

import org.gradle.api.Plugin;
import org.gradle.api.Project;

public class GreetingPlugin implements Plugin<Project> {
    public void apply(Project project) {
        project.getTasks().create("hello", Greeting.class, (task) -> {
            task.setMessage("Hello");
            task.setRecipient("World");
            // Added this line per comments from members
            task.setProjectDir(project);
        });
    }
}

...and...

package org.example.greeting;

import org.gradle.api.DefaultTask;
import org.gradle.api.tasks.TaskAction;
import org.gradle.api.Project;
import java.io.*;

public class Greeting extends DefaultTask {
    private String message;
    private String recipient;
    private File projectDir;
    private Project project;

    public String getMessage() { return message; }
    public void setMessage(String message) { this.message = message; }

    public String getRecipient() { return recipient; }
    public void setRecipient(String recipient) { this.recipient = recipient; }

    public File getProjectDir() { return projectDir; }
    public void setProjectDir(File projectDir) { this.projectDir = projectDir; }

    public Project getProject() { return project; }
    public void setProject(Project project) { this.project = project; }

    @TaskAction
    void sayGreeting() {
        System.out.printf("%s, %s, %s!\n", getProject().getRootDir().toString(), getMessage(), getRecipient()); 
    }       
}           

and it works now.

Upvotes: 1

Related Questions