在预编译脚本插件中覆盖外部插件版本

Override external plugin version in precompiled script plugin

我正在使用 Gradle 构建工具。我有一个预编译的 Gradle 脚本插件 X,可以说这是一个约定插件。在插件的 build.gradle 中,我定义了对另一个外部插件 Y 的依赖。

插件X:build.gradle:

dependencies {
  implementation "com.rivancic.y:y-gradle-plugin:${versionYPlugin}"
}

插件X:gradle.属性

versionYPlugin:1.0.0

然后在我的主项目中,我应用了预编译脚本插件X,我想手动设置外部插件Y的版本,可以吗?我找不到从 A 覆盖插件 Y 版本的方法。

如果我在项目A:gradle.properties 中定义版本

versionYPlugin=1.1.0

没用,还在解决1.0.0版本

如果我想动态设置外部插件版本,还有其他方法吗?

您混淆了项目和构建时间与应用程序时间。
X:build.gradle 是您的插件的构建文件。
在构建 A 可以应用 X 之前,需要构建 X
X 的构建是一个完全独立的构建。
您在项目 A 上的项目 属性 与 X 的构建无关,因此无法影响 X 的构建,无论这是否是 [=18] =]、包含构建或独立构建。

如果 XbuildSrc 或一个包含的构建,您可以考虑一些方法在构建期间重用 A 的 gradle.properties,但是您想要从消费者,我想它是独立构建的,或者您可以直接在 X 的构建中更改它。

所以 X 可能是一个独立的构建,当 A 想要应用它时,它已经构建并且有一个元数据文件,其中包含 Y 的版本构建时在 X 中定义。

要使用不同版本的 Y,您必须确保它位于 A 的构建脚本 class 路径中。例如,您可以执行 plugins { id("com.rivancic.y") version "3.1.0" apply false } 以便它位于 A 的构建脚本 class 路径中并用于代替 X 所依赖的版本。
或者您可以将其定义为 buildSrc runtimeOnly 依赖项,只是将其放入所有构建脚本的 class 路径。
...