如何在插件中使用gradle插件配置?

时间:2019-09-02 21:30:50

标签: gradle gradle-plugin

我正在编写一个自定义Gradle插件,该插件需要将一定的依赖项添加到子项目中。这种依赖性要求用户提供版本信息,因此我决定创建一个Extension。但是,由于我的属性是在插件的<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Redirecting to https://example.com</title> <meta http-equiv="refresh" content="0; URL=https://example.com"> </head> <link rel="canonical" href="https://example.com"> </html> 方法中引用的,因此,在引用它们之前,我实际上无法对其进行突变。我的插件看起来像这样:

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"
      ]
    }
  }
}

有更好的方法吗?该插件将由其他开发人员使用,因此我非常渴望保持API尽可能的好。理想情况下,我想要类似的东西:

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"
}


我尝试在this Gradle support thread中所述的生命周期回调之一中添加依赖项。但是,我发现project("incorrect-module-1") { apply plugin: "carter.my-plugin" { scalaLibraryVersion = "2.11.12" macroParadiseVersion = "2.1.1" } // rest of this subproject's configuration } 回调发生得太早了,没有使用我的扩展程序配置,而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. 还不够晚,那么这种事情是不可能的吗?有没有办法将依赖关系解析延迟到项目“评估”之后?

通过我使用Gradle 5.1版的方式

1 个答案:

答案 0 :(得分: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"
          ]
        }

    }
}