首页 > 解决方案 > Gradle:如何在 Gradle 插件中派生项目目录路径?

问题描述

Gradle v2.9(旧,我们即将升级)

我正在尝试按照Writing Gradle Plugins创建一个 Gradle 插件。我怎样才能让插件“派生”项目的顶级目录,即build.gradle文件所在的位置?如果插件创建一个hello任务,我希望它这样做

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

标签: javagradlegradle-plugin

解决方案


根据成员的评论,我能够做到这一点

根据评论,我在代码中做到了这一点

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);
        });
    }
}

...和...

包 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()); 
    }       
}           

现在可以了。


推荐阅读