如何从初始化脚本应用Gradle版本插件?

如何从初始化脚本应用Gradle版本插件?,gradle,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'

我正在尝试设置,以便可以使用,而无需将其添加到所有
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
}
如果我随后尝试在我的repo中调用
/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版本插件


顺便说一下,我正在使用Gradle4.3.1。插件可以用几种不同的方式应用。在该问题的参考答案中,他们正在接受。你也可以

在您的第二次尝试中,当您通过Id应用时,您做的是正确的,但生成错误是:

找不到id为“com.github.ben manes.versions”的插件

这里的问题是你

解决方法是,按类型应用插件

幸运的是,该插件是开源的,因此发现插件类型相对简单。插件Id是
com.github.ben manes.versions
,这将我们带到。该文件包含行
implementation class=com.github.benmanes.gradle.versions.VersionsPlugin
,它告诉我们插件的类型是 . 这也可以通过将插件应用到构建中(而不是通过初始化脚本)并检查项目中的
plugins
pluginManager
来确定,以列出插件类型

要使修复更改此行,请执行以下操作:

apply插件:“com.github.ben manes.versions”
致:

应用插件:com.github.benmanes.gradle.versions.VersionsPlugin
因此,完整、有效的initscript是:

initscript{
存储库{
jcenter()
}                                                                           
依赖项{
classpath'com.github.ben manes:gradle版本插件:0.17.0'
}                                                                           
}                                                                               
所有项目{
应用插件:com.github.benmanes.gradle.versions.VersionsPlugin
}                                                                               

我使用@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
      }
    }
  }
}

首先是
com.github.ben manes.versions
没有引号。当你应用这样的插件时,你是通过id来应用的。@mkobit如问题中所述,我尝试了带引号和不带引号。对不起,完全是我的错,我躺在床上,错过了。我明天再看一下。@mkobit没问题!我认为不加引号的版本看起来也是一个词,但另一个答案似乎意味着缺少引号很重要。不管怎样,如果你明天能再看一眼,我会很感激的。谢谢谢谢你的详细回答,它实际上解释了这里发生的事情!这样做会导致
无法获取org.gradle.api.project类型的根项目“edited”的未知属性“com”。
@Brice这是来自初始化脚本的吗?如果有一个新问题和完整的例子,可能会更容易些。@mkobit我真的不明白哪里出了问题。然而,我的项目sricpt是应用具有其他构建脚本的外部脚本。因此,将
apply插件
移动到这些脚本中的其他位置是可行的。