1

I have created a custom Gradle plugin like this,

DummyPlugin.java

public class DummyPlugin implements Plugin<Project> {
    @Override
    public void apply(Project project) {
        project.getTasks().create("dummy", DummyTask.class);
        project.getExtensions().create("dummy", DummyExtension.class);
    }
}

DummyTask.java

public class DummyTask extends Test {
    @TaskAction
    public void dummy() {
        Project project = getProject();
        DummyExtension extension = project.getExtensions().findByType(DummyExtension.class);
        System.out.println("Env of dummy is " + extension.getEnv());
    }
}

DummyExtension.java

public class DummyExtension {
    private String env;

    public String getEnv() {
        return env;
    }

    public void setEnv(String env) {
        this.env = env;
    }
}

Now, I have created three tasks for different environments, like this :

apply plugin: 'dummy'

task dummyCI(type: DummyTask) {
    dummy {
        env = 'ci'
    }
}

task dummyDev(type: DummyTask) {
    dummy {
        env = 'dev'
    }
}

task dummyTest(type: DummyTask) {
    dummy {
        env = 'test'
    }
}

But, on running ./gradlew dummyCI, instead of getting Env of dummy is ci, I'm getting Env of dummy is test. Same for ./gradlew dummyDev also.

How do I fix this issue? Thanks.

Msp
  • 2,493
  • 2
  • 20
  • 34

1 Answers1

2

You're setting the extension property in the configuration phase which always runs. So each invocation is overriding the previous. To set it in the execution phase, use a doFirst { ... } block. Eg:

task dummyCI(type: DummyTask) {
    doFirst {
        dummy {
            env = 'ci'
        }
    }
}

Or perhaps a better solution is to get rid of the extension object all together and instead add the env property (input?) to the DummyTask

lance-java
  • 25,497
  • 4
  • 59
  • 101