如何在初始化脚本中应用Gradle Versions插件?

5
我正在尝试设置一些东西,以便我可以使用 Gradle版本插件,而无需将其添加到所有build.gradle文件中。
根据这个相关问题的答案,我尝试创建一个文件~/.gradle/init.d/50-ben-manes-versions.gradle:
initscript {
    repositories {
       jcenter()
    }

    dependencies {
        classpath 'com.github.ben-manes:gradle-versions-plugin:0.17.0'
    }
}

allprojects {
    apply plugin: com.github.ben-manes.versions
}

如果我在我的代码库中尝试调用./gradlew dependencyUpdates,则会得到以下结果:
FAILURE: Build failed with an exception.

* Where:
Initialization script '~/.gradle/init.d/50-ben-manes-versions.gradle' line: 13

* What went wrong:
Could not get unknown property 'com' for root project 'project-name' of type org.gradle.api.Project.

那个答案说插件名称不需要加引号,但是由于这并没有起作用,我尝试添加引号(例如:apply plugin: 'com.github.ben-manes.versions')。这样做后,我得到了以下结果:
FAILURE: Build failed with an exception.

* Where:
Initialization script '~/.gradle/init.d/50-ben-manes-versions.gradle' line: 13

* What went wrong:
Plugin with id 'com.github.ben-manes.versions' not found.

有没有办法从initscript中应用Gradle Versions插件?

顺便说一下,我正在使用Gradle 4.3.1。


首先,com.github.ben-manes.versions 没有被引号包围。当您应用这样的插件时,您是通过 ID 应用它的。 - mkobit
如问题所述,我尝试过带引号和不带引号两种方式。 - Laurence Gonsalves
抱歉,完全是我的错,我躺在床上错过了这个。明天我会看一下的。 - mkobit
@mkobit 没问题!我也觉得没有引号的版本看起来有点奇怪,但是另一个答案似乎暗示了缺少引号很重要。无论如何,如果你明天能再看一下,我会很感激。谢谢! - Laurence Gonsalves
2个回答

5

插件可以通过几种不同的方式应用。在问题的参考答案中,它们被按类型应用。你也可以通过插件ID应用,这是一个String

在第二次尝试中,当您通过ID应用时,您正在做正确的事情,但构建会出现错误:

找不到ID为'com.github.ben-manes.versions'的插件。

问题在于,您目前无法从init脚本(#gradle/1322)按ID应用插件

解决方案是改为按类型应用插件。

幸运的是,这个插件是开源的,因此相对容易发现插件的类型。插件 Id 是 com.github.ben-manes.versions,这将带领我们查看 META-INF/gradle-plugins/com.github.ben-manes.versions.properties 文件。该文件包含一行 implementation-class=com.github.benmanes.gradle.versions.VersionsPlugin,告诉我们插件的类型为 com.github.benmanes.gradle.versions.VersionsPlugin。这也可以通过将插件应用于构建(而不是通过初始化脚本)并检查项目中的 pluginspluginManager 列出插件类型来确定。

要进行修复,请更改此行:

apply plugin: 'com.github.ben-manes.versions'

到:

apply plugin: com.github.benmanes.gradle.versions.VersionsPlugin

所以完整的,可工作的初始化脚本如下:

initscript {                                                                    
    repositories {                                                              
       jcenter()                                                                
    }                                                                           

    dependencies {                                                              
        classpath 'com.github.ben-manes:gradle-versions-plugin:0.17.0'          
    }                                                                           
}                                                                               


allprojects {                                                                   
    apply plugin: com.github.benmanes.gradle.versions.VersionsPlugin            
}                                                                               

感谢您提供详细的答案,真正解释了这里发生了什么! - Laurence Gonsalves
这样做会导致 Could not get unknown property 'com' for root project 'edited' of type org.gradle.api.Project. 错误。 - bric3
@Brice 这是从一个 init 脚本中来的吗?也许用一个新问题和完整的示例会更容易些。 - mkobit
@mkobit,我不是很明白出了什么问题。但是我的项目脚本应用了其他构建脚本部分的外部脚本。因此,在这些脚本中将apply plugin移动到其他位置就可以解决问题了。 - bric3

2

我一直在使用@mkobit的解决方案,它很好用。然而,如果你正在处理的项目已经应用了版本插件,它就不能支持这种情况。

现在我正在使用一个稍微修改过的脚本(在Groovy DSL中),如果插件已经存在,它就不会再应用插件:

Original Answer翻译成“最初的回答”

initscript {
    repositories {
        mavenCentral()
    }

    dependencies {
        classpath 'com.github.ben-manes:gradle-versions-plugin:0.42.0'
    }
}

allprojects {
    afterEvaluate { project ->
        if (project.parent == null) {
            def hasPlugin = project.plugins.any {
                it.class.name == "com.github.benmanes.gradle.versions.VersionsPlugin"
            }

            if (!hasPlugin) {
                project.apply plugin: com.github.benmanes.gradle.versions.VersionsPlugin
            }
        }
    }
}

编辑:现在有一个API可以查询插件是否已应用。以下是Kotlin DSL的示例:

Original Answer翻译成“最初的回答”

initscript {
    repositories {
        gradlePluginPortal()
    }

    dependencies {
        classpath("com.github.ben-manes:gradle-versions-plugin:0.42.0")
    }
}
// don't use rootProject as it may not be ready
allprojects {
    afterEvaluate {
        if (parent == null) {
            if (!plugins.hasPlugin("com.github.ben-manes.versions")) {
                apply<com.github.benmanes.gradle.versions.VersionsPlugin>()
            }
        }
    }
}

已测试通过Gradle 7.4


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接