在 Gradle 插件中从 settings.gradle 访问属性

Gam*_*ega 10 settings gradle build.gradle

我正在使用以下指南构建自定义 Gradle 插件。我想在settings.gradle文件中定义一个属性并在插件类中读取它,但到目前为止每次尝试都失败了。

这是我得到的错误:

Could not find property 'MyProperty' on root Project 'MyProject'
Run Code Online (Sandbox Code Playgroud)

这是我的settings.gradle文件:

gradle.ext.MyProperty = "The Value"
Run Code Online (Sandbox Code Playgroud)

这是包含我的插件的文件:

package myplugin.gradle

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

class FirstPlugin implements Plugin<Project> {
    void apply(Project project) {
        project.task('myTask') << {
            def instance = project.MyProperty
            println "VALUE : " + instance
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

MyProperty如果我放入project.ext.set("MyProperty", "Property Value"),我可以访问build.gradle,但我找不到在settings.gradle文件中设置它的方法。

我想解决这个问题的一种方法是读取settings.gradlein的内容build.gradle并使用 将其发送到插件project.ext.set(...),但有没有更直接的方法?

Gam*_*ega 6

显然,要走的路(无论如何更好)是使用扩展对象。这个扩展对象允许将数据从build.gradle文件发送到插件。该build.gradle文件读取文件中变量的内容settings.gradle并将其放入扩展对象中。

在包含插件的文件中:

package myplugin.gradle

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

class MyExtension {
    String myProperty
}

class FirstPlugin implements Plugin<Project> {
    void apply(Project project) {
        project.extensions.create('myExtensionName', MyExtension)
        project.task('myTask') << {
            def instance = project.myExtensionName.myProperty
            println "VALUE : " + instance
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

build.gradle文件中:

apply plugin: 'myPluginName'
...

myExtensionName {
    myProperty = gradle.ext.myPropertyInSettings
}
Run Code Online (Sandbox Code Playgroud)

最后,在settings.gradle文件中:

gradle.ext.myPropertyInSettings = "The Value"
Run Code Online (Sandbox Code Playgroud)

另外,我推荐教程而不是 Gradle 提供的教程。