2013-04-04 56 views
1

嗨,我想动态创建和配置基于插件扩展值的任务,问题似乎是评估顺序,有没有什么办法可以解决它?配置自定义插件使用扩展参数

apply plugin: SetupPlugin 

setup { 
    destDir = 'some directory set per project in build.gradle' 
    sourceFile = 'some file set per project in build.gradle' 
} 


class PluginExtension { 
    String destDir 
    String sourceFile 
} 

class SetupPlugin implements Plugin<Project> { 
    def placeholders 

    void apply(Project project) { 
     project.extensions.create("setup", PluginExtension) 

     project.task ("setupEnvironment", type: Copy) { 
      doFirst() { 
       //computes placeholders <-- project.setup has value here 
      } 

      into (project.setup.destDir){ //<-- project.setup is null 
       from project.setup.sourceFile 
      } 
      filter(org.apache.tools.ant.filters.ReplaceTokens, tokens: placeholders) 
     } 
    } 
} 

回答

0

这是因为apply在应用设置设置之前被调用。

它适用于doFirst,因为它在构建期间在apply之后调用。 也许你可能会把你的副本包装到doLast

1

将此移入doFirst块可能会导致一些副作用,因为在执行时重新配置副本任务的参数而不是配置时间,因此最新任务可能会遇到问题。一个应该做的诀窍quickfix是推迟使用闭包评估:

... 
void apply(Project project) { 
     project.extensions.create("setup", PluginExtension) 

     project.task ("setupEnvironment", type: Copy) { 
      doFirst() { 
       //computes placeholders <-- project.setup has value here 
      } 

      into {project.setup.destDir} 
      from { project.setup.sourceFile } 
      filter(org.apache.tools.ant.filters.ReplaceTokens, tokens: placeholders) 
     } 
} 
... 

希望帮助!

欢呼声, 勒

0

原来我问,我认为是非常相似的这一个问题。我可能会错过一个细微的差异,但如果它有帮助:here it is.