如何在插件应用中使用gradle插件配置?
How to use gradle plugin configuration in the plugin apply?
我正在编写一个自定义 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
还不够晚,那么这种事情是不可能的?有没有办法将依赖项解析延迟到项目 "evaluated"?
之后
顺便说一下,我使用的是 Gradle 5.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"
]
}
}
}
我正在编写一个自定义 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
还不够晚,那么这种事情是不可能的?有没有办法将依赖项解析延迟到项目 "evaluated"?
顺便说一下,我使用的是 Gradle 5.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"
]
}
}
}