如何从脚本中应用Gradle Versions插件?

时间:2018-01-18 23:54:24

标签: gradle

我尝试进行设置,以便我可以使用Gradle Versions Plugin,而无需将其添加到我的所有build.gradle文件中。

根据this answer to a related question,我尝试创建文件~/.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.

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

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

2 个答案:

答案 0 :(得分:4)

插件可以通过几种不同的方式应用。在问题的引用答案中,它们是applied by type。您还可以apply by plugin Id, which is a String

在您通过Id申请的第二次尝试中,您正在做正确的事情,但构建错误与:

  

带有id' com.github.ben-manes.versions'的插件没找到。

这里的问题是你currently cannot apply plugins by Id from init scripts (#gradle/1322)

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

幸运的是,该插件是开源的,所以发现插件的类型相对简单。插件ID为com.github.ben-manes.versions,引导我们转到META-INF/gradle-plugins/com.github.ben-manes.versions.properties file。该文件包含行implementation-class=com.github.benmanes.gradle.versions.VersionsPlugin,它告诉我们插件的类型是  com.github.benmanes.gradle.versions.VersionsPlugin。这也可以通过将插件应用于构建(而不是通过init脚本)并检查项目中的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            
}                                                                               

答案 1 :(得分:1)

我现在正在使用@mkobit的解决方案。它工作得很好,但是当您正在处理的项目已经应用了版本插件时,它不支持这种情况。

我正在使用该脚本的稍作修改的版本,如果该插件已经存在,则不应用该插件:

initscript {
  repositories {
    jcenter()
  }

  dependencies {
    classpath 'com.github.ben-manes:gradle-versions-plugin:0.21.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
      }
    }
  }
}