【问题标题】:How to use gradle plugin configuration in the plugin apply?如何在插件应用中使用 gradle 插件配置?
【发布时间】:2019-09-02 21:30:50
【问题描述】:

我正在编写一个自定义 Gradle 插件,它需要将某个依赖项添加到子项目中。这个依赖需要用户提供版本信息,所以我决定创建一个Extension。但是,由于我的属性在我的插件的 apply 方法中被引用,所以在它们被引用之前我实际上无法改变它们。我的插件看起来像这样:

class MyPluginExtension {
  abstract String scalaLibraryVersion
  abstract String macroParadiseVersion
}

class MyPlugin implements Plugin<Project> {
  void apply(Project project) {
    project.extensions.create("myConfig", PluginExtension)

    project.configure(project) {
      apply plugin: 'scala'
    }

    String pluginConfiguration = 'myPluginConfiguration'
    project.configurations.create(pluginConfiguration)

    String scalaLib = project.myConfig.scalaLibraryVersion
    String paradise = project.myConfig.macroParadiseVersion
    String paradiseDependency = "org.scalamacros:paradise_${scalaLib}:${paradise}"

    project.dependencies.add(pluginConfiguration, paradiseDependency)

    project.tasks.withType(ScalaCompile) {
      scalaCompileOptions.additionalParameters += [
          "-Xplugin:" + project.configurations.getByName(pluginConfiguration).asPath,
          "-Xplugin-require:macroparadise"
      ]
    }
  }
}

它会像这样应用:

project("incorrect-subproject-1") {
  apply plugin: "carter.my-plugin"
  myConfig.scalaLibraryVersion = "2.11.12" // This is too late. The library version is already set to null
}

project("incorrect-subproject-2") {
  myConfig.scalaLibraryVersion = "2.11.12" // This is too early. myConfig references nothing
  apply plugin: "carter.my-plugin"
}

有没有更好的方法来做到这一点?这个插件将被其他开发人员使用,所以我真的很想保持 API 尽可能好。理想情况下,我想要这样的东西:

project("incorrect-module-1") {
  apply plugin: "carter.my-plugin" {
    scalaLibraryVersion = "2.11.12"
    macroParadiseVersion = "2.1.1"
  }

  // rest of this subproject's configuration
}


我已尝试在this Gradle support thread 中描述的生命周期回调之一中添加依赖项。但是,我发现beforeResolve 回调发生得太早,我的扩展配置没有使用,afterEvaluate 回调发生得太晚,我得到:

FAILURE: Build failed with an exception.

* What went wrong:
A problem occurred configuring project ':incorrect-subproject-1'.
> Cannot change dependencies of configuration ':incorrect-subproject-1:myPluginConfiguration' after it has been resolved.

当然,如果beforeResolve 还不够晚,那么这种事情是不可能的?有没有办法将依赖解决延迟到项目“评估”之后?

顺便说一句,我使用的是 Gradle 5.1 版

【问题讨论】:

    标签: gradle gradle-plugin


    【解决方案1】:

    您应该能够通过在 project.beforeEvaluate 中引用这些设置来实现此目的。举个例子:

    void apply(Project project) {
        super.apply(project)
    
        project.extensions.create("myConfig", Configuration)
    
        project.beforeEvaluate {
            String scalaLib = project.myConfig.scalaLibraryVersion
            String paradise = project.myConfig.macroParadiseVersion
            String paradiseDependency = "org.scalamacros:paradise_${scalaLib}:${paradise}"
    
            project.dependencies.add(pluginConfiguration, paradiseDependency)
    
            project.tasks.withType(ScalaCompile) {
              scalaCompileOptions.additionalParameters += [
                "-Xplugin:" + project.configurations.getByName(pluginConfiguration).asPath,
                "-Xplugin-require:macroparadise"
              ]
            }
    
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2021-08-23
      • 1970-01-01
      • 2023-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多