2017-01-16 51 views
0

我打算编写包装几个代码质量gradle插件的自定义插件。逻辑很简单:使用这种自定义质量我想强制执行我们所有项目的“默认”标准。另一方面,我希望所有包装的插件仍然可以定制(例如,我想默认情况下设置PMD插件为“基本”规则集,但是我绝对不想限制任何人添加插件规则集)。指定默认扩展值的Gradle插件

级联扩展的建议策略是什么?

  • 我应该做的所有插件project.create({}扩展),检查值如果值设置和默认他们(和我将如何从插件扩展,由用户设置的默认值区分默认?)
  • 我应该创建myOwnExtension并从这个自定义设置中打包插件扩展的值吗?
  • 是否有任何其他方式如何自动执行级联?

谢谢!

回答

1

你可以申请一个使用project.afterEvaluate的插件,然后以编程方式查找插件,如果它被应用,然后检查pmd块并根据需要进行配置。如果插件未应用,则应用该插件并设置该块的默认值。

apply plugin: "groovy" 

group = 'com.jbirdvegas.q41683529' 
version = '0.1' 

repositories { 
    jcenter() 
} 

class PmdWrapper implements Plugin<Project> { 
    @Override 
    void apply(Project target) { 
     target.afterEvaluate { 
      def pmdPlugin = target.plugins.findPlugin(PmdPlugin) 
      // check if the plugin is already applied if not apply it 
      if (!pmdPlugin) { 
       target.plugins.apply(PmdPlugin) 
      } 
      // get a reference to the extension and use it to manipulate the values 
      println target.pmd.ruleSets 
      setValues(target.pmd as PmdExtension) 
      println target.pmd.ruleSets 

      println "Now configured ruleSets: ${(target.pmd as PmdExtension).ruleSets}" 
     } 
    } 

    static setValues(PmdExtension pmd) { 
     // here you can set the values or add or manipulate as needed 
     if (!pmd.ruleSets.contains('basic') || !pmd.ruleSets.contains('braces')) { 
      pmd.ruleSets << "basic" << "braces" 
     } 
     // blah for other values 
    } 
} 

apply plugin: PmdWrapper 
task nothing {} 

然后你就可以看到所配置的PMD插件的结果

$ ./gradlew -b build_simple.gradle nothing -q 
[java-basic] 
[java-basic, basic, braces] 
Now configured extension: [java-basic, basic, braces]