在任务创建期间访问项目扩展?

Access Project Extensions during task creation?

我在 myplugin.gradle 中创建了一个插件:

apply plugin: MyPlugin

class MyPluginExtension {
   String srcDir = null
}

class MyTask extends DefaultTask {

   @InputFiles FileCollection srcFiles

   @TaskAction
   def task() {
      println srcFiles
   }
}

class MyPlugin implements Plugin<Project> {

 @Override
 void apply(Project project) {
    project.with {
       project.extensions.create("myConfig", MyPluginExtension)
       tasks.create(name: "firstTask", type: MyTask) {
       srcFiles = files(fileTree(dir: "mySrcDir",  // need to access srcDir
              include: "**/*.java"))
       }
    }
  }
}

创建任务时,我需要设置 srcFiles。为此,我需要从插件扩展中访问 srcDir属性。我想用插件扩展中指定的 srcDir 替换 mySrcDir

我需要它来设置 MyTask 输入的 srcFiles。这必须在任务之外设置,以便 gradle 可以跟踪任务是否是最新的以及是否有任何源文件已更改。

如何在创建任务期间从项目扩展访问属性?

这是不可能的。您需要创建扩展,使用它然后配置任务。现在您创建扩展并立即使用它来配置任务 - srcDir 值将始终为空。这就是要走的路:

apply plugin: MyPlugin

myConfig {
    srcDir = 'lol'
}

class MyTask extends DefaultTask {

    @InputFiles 
    FileCollection srcFiles

    @TaskAction
    def task() {
        println srcFiles
    }
}

class MyPluginExtension {
    String srcDir = null
}

class MyPlugin implements Plugin<Project> {

    @Override
    void apply(Project project) {
        project.extensions.create('myConfig', MyPluginExtension)
        project.tasks.create(name: "firstTask", type: MyTask) 
    }
}

firstTask {
    srcFiles = project.files(project.fileTree(dir: project.myConfig.srcDir, include: "**/*.java"))
}