插件jar中的Gradle扩展对象(常规代码)

约翰·艾利安(John Elion)

我正在尝试将代码从用“ apply from:”附带的Gradle脚本编写的几个插件集中移动到“ apply plugin:”附带的一罐Groovy脚本中。我大部分时候都取得了成功,但是在为具有扩展插件的插件创建“扩展对象”时遇到了麻烦。我似乎无法在插件的apply函数中引用扩展类名称。我缺少基本的东西-这是什么?

我将问题简化为一个简单的示例,希望它将作为有用的模板。这是一个名为“ sample”的插件:

插件:plugin \ src \ main \ groovy \ com \ company \ gradle \ sample.groovy:

package com.company.gradle

import org.gradle.api.GradleException
import org.gradle.api.Project
import org.gradle.api.Plugin
import org.gradle.api.Task

//  Configuration object (project may override these values)
class sampleExtension {
  String product   //  product code - 3 alphanumeric characters
  String customer  //  customer id - integer 0-999999

  sampleExtension() {
    this.product  = 'ABC'
    this.customer = '123'
  }
}

class sample implements Plugin<Project> {

  void apply(Project target) {

println "SAMPLE: A"
    //  create the configuration objects for this plugin
    target.extensions.create('sample', sampleExtension)
println "SAMPLE: B"
    //  This task generates the license.
    Task sampleTask = target.task('printProperties') {  
      doFirst {
        println("target.sample.product  = '$target.sample.product'")
        println("target.sample.customer = '$target.sample.customer'")
      }
    }
println "SAMPLE: C"
  }
}

printlns很有帮助,因为在使用示例的项目中,插件错误被报告为在项目脚本而不是插件脚本中的某些行发生。我不确定构造函数是否必要;我也尝试过将扩展类嵌套在类'sample'中

插件\ src \ main \ resources \ META-INF \ gradle-plugins \ sample.properties:

implementation-class=com.company.gradle.sample

plugin \ build.gradle

apply plugin: 'groovy'
apply plugin: 'maven'

dependencies {
  compile gradleApi()
  compile localGroovy()
}

group   = 'com.company.gradle'
version = '1.0'

uploadArchives {
  repositories { mavenDeployer { repository(url: uri('../repo')) }}
}

那是插件。这是项目脚本,对于此示例而言,该脚本没有代码-只需执行示例插件提供的任务即可:

project \ build.gradle:

buildscript {
  repositories{ maven{url uri('../repo')} }
  dependencies { classpath 'com.company.gradle:plugin:1.0' }
}

apply plugin: 'sample'

该插件使用“ gradle build uploadArchives”构建,并且编译干净。该项目使用“ gradle printProperties”构建。它显示“ A”消息,并抱怨它未能应用示例插件,因为类'com.company.gradle.sample'的'无此类属性:sampleExtension'。

c:\jdev\project>gradle printProperties
SAMPLE: A

FAILURE: Build failed with an exception.

* Where:
Build file 'C:\jdev\project\build.gradle' line: 9

* What went wrong:
A problem occurred evaluating root project 'project'.
> Failed to apply plugin [id 'sample']
   > No such property: sampleExtension for class: com.company.gradle.sample

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug
option to get more log output.

BUILD FAILED

Total time: 2.13 secs

当插件被编写为包含在project \ build.gradle中的'sample.groovy'脚本,并带有'apply from:sample.groovy'时,插件代码起作用。

嵌套我的扩展类时,失败有所不同:“无法创建com.company.gradle.sample $ sampleExtension_Decorated类型的实例。”

当您有扩展对象并且插件以.groovy编写以用于插件jar而不是.gradle进行直接包含时,该模式是什么?

感谢您抽出宝贵的时间来解决所有这些问题...

JBird维加斯

使用经过稍微修改的代码版本,我可以获取模型的值。

build.gradle:

group 'com.jbirdvegas.so'
version '1.0-SNAPSHOT'

apply plugin: 'groovy'
// apply our plugin... calls SamplePlugin#apply(Project)
apply plugin: 'sample'

repositories {
    mavenCentral()
}

dependencies {
    compile localGroovy()
}

// caller populates the extension model applied above
sample {
    product = 'abc'
    customer = 'zyx'
}

// dummy task to limit console output for example
task doNothing <<{}

buildSrc / src / main / groovy / com / jbirdvegas / so / a3850424 / SamplePlugin.groovy:

package com.jbirdvegas.so.a38504024

import org.gradle.api.Plugin
import org.gradle.api.Project

class SamplePlugin implements Plugin<Project> {
    @Override
    void apply(Project target) {
        // create our extension on the project for our model
        target.extensions.create('sample', SampleModel)
        // once the script has been evaluated the values are available
        target.afterEvaluate {
            // here we can do whatever we need to with our values
            println "populated model: $target.extensions.sample"
        }
    }
}

buildSrc / src / main / groovy / com / jbirdvegas / so / a38504024 / SampleModel.groovy:

package com.jbirdvegas.so.a38504024
// define our DSL model
class SampleModel {
    public String product;
    public String customer;

    @Override
    public String toString() {
        final StringBuilder sb = new StringBuilder("SampleModel{");
        sb.append("product='").append(product).append('\'');
        sb.append(", customer='").append(customer).append('\'');
        sb.append('}');
        return sb.toString();
    }
}

buildSrc / src / main / resources / META-INF / gradle-plugins / sample.properties

implementation-class=com.jbirdvegas.so.a38504024.SamplePlugin

使用此设置,我们可以在DSL块中看到呼叫者提供的值

$ ./gradlew -q doNothing
SampleModel{product='abc', customer='zyx'}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何将build.gradle中的gradle jar配置转换为插件代码

在gradle的插件扩展中传递闭包

用动态对象组配置Gradle插件扩展的正确方法

用于依赖扩展对象的任务的Gradle插件最佳实践

何时在Gradle插件中应用自定义Android扩展?

将插件添加到本地jar的gradle buildscript中

gradle ssh插件中的参考spring-boot组装jar

如何让Teamcity Artifactory插件调用bootJar而不是Gradle中的Jar?

Eclipse插件代码找不到“ javax.inject.Inject”类,插件jar现在不在插件目录中

是否有用于Microsoft Word的插件来格式化常规文档中的源代码示例?

Gradle 和插件扩展关闭执行顺序

如何在Gradle Kotlin DSL中配置Firebase Performance Monitoring插件扩展

了解Gradle任务定义中的常规语法

如何在自定义 gradle 插件中创建 .jar 文件?

由maven-publish gradle插件发布时,删除JAR名称中的“ -all”后缀

阅读常规代码中的composer额外配置

eclipse插件中的外部jar

在插件中安装本地jar

Gradle插件3中文件的版本名称和代码

如何访问插件 Java 源代码中的 gradle.ext 属性?

Gradle中的发布jar

扩展Javascript中的对象

扩展对象中的数组?

无法解析 Gradle 脚本插件中的插件(外部 Gradle 文件)

Windows Shell扩展中的“ Bluewire常规属性表”是什么?

Kotlin Gradle 插件:如何访问“项目”扩展,例如“sourceSets”?

使用Java定义Gradle插件属性扩展的正确方法吗?

使用 Kotlin 实现插件时,如何为 Gradle 扩展任务?

如何检查对象是否是 JavaScript 中的常规对象