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

如何在插件应用中使用gradle插件配置?,gradle,gradle-plugin,Gradle,Gradle Plugin,我正在编写一个定制的Gradle插件,它需要在子项目中添加一个特定的依赖项。这个依赖项需要用户提供版本信息,所以我决定创建一个。然而,由于我的属性是在我的插件的apply方法中引用的,所以在它们被引用之前,我实际上不能对它们进行变异。我的插件看起来像这样: class MyPluginExtension { abstract String scalaLibraryVersion abstract String macroParadiseVersion } class MyPlugin

我正在编写一个定制的Gradle插件,它需要在子项目中添加一个特定的依赖项。这个依赖项需要用户提供版本信息,所以我决定创建一个。然而,由于我的属性是在我的插件的
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
}

我已尝试在一次生命周期回调期间添加依赖项,如中所述。但是,我发现
beforesolve
回调发生得太早,没有使用我的扩展配置,
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版,您应该能够通过在project.beforevaluate中引用这些设置来实现这一点。举个例子:

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

    }
}