【问题标题】:Gradle standalone plugin unknown property when loaded from github repository从 github 存储库加载时 Gradle 独立插件未知属性
【发布时间】:2024-05-02 06:50:02
【问题描述】:

我在 Java 中创建了一个简单的独立 Gradle 插件,并在 GitHub 上创建了一个 Maven 存储库,用于发布该插件。除了检索插件应该可用的项目属性外,一切正常。当我在另一个 Gradle 项目中应用该插件时,它找不到这些属性。

仅当插件从 GitHub 上的远程存储库加载时才会发生。从本地存储库加载时,它可以工作。插件实现是否可以以某种方式设置为甚至从远程存储库提供属性?或者这是不能被黑客入侵的 GitHub 功能?

详情如下:

我在另一个项目中的build.gradle 看起来像这样:

buildscript {
    repositories {
        maven {
            url "GITHUB_REPO_URL"
        }
    }

    dependencies {
        classpath "custom_plugin_group:custom_plugin:1.0"
    }
}

apply plugin: "custom_plugin"

task propertyTest {
    doLast {
        println project.customProperty
    }
}

当我尝试运行任务 propertyTest 时,它失败并抱怨“无法为 org.gradle.api.Project 类型的根项目 'another_project' 获取未知属性 'customProperty'。”

我正在主插件类的方法 apply 中创建属性。我尝试了以下三种方法:

// First approach - adding a simple value to extensions
public class CustomPlugin implements Plugin<Project> {
    @Override
    public void apply(Project project) {            
        project.getExtensions().add("customProperty", "Custom property value");
    }
}
// Second approach - setting extra property to extensions
public class CustomPlugin implements Plugin<Project> {
    @Override
    public void apply(Project project) {            
        project.getExtensions().getExtraProperties().set("customProperty", "Custom property value");
    }
}
// Third approach - adding a property instance to extensions
public class CustomPlugin implements Plugin<Project> {
    @Override
    public void apply(Project project) {            
        Property<String> customProperty = project.getObjects().property(String.class);
        customProperty.set("Custom property value");
        project.getExtensions().add("customProperty ", customProperty);
    }
}

【问题讨论】:

    标签: github gradle plugins properties


    【解决方案1】:

    要为您的 Gradle 插件创建扩展,您需要创建带有字段的 POJO 类:

    class YourExtension {
      String customProperty
    }
    

    然后在你的插件类中创建扩展:

    public class CustomPlugin implements Plugin<Project> {
    
      @Override
      public void apply(Project project) {
        project.getExtensions().create("extensionName", YourExtension.class);
      }
    }
    

    现在您可以在build.gradle 文件中使用扩展名:

    extensionName {
        customProperty = "value"
    }
    

    【讨论】:

      最近更新 更多