如何将Gradle插件(及其依赖项)加载到build.gradle文件中?

5

我有一个项目有两个gradle文件:build.gradlemyPlugin.gradle

myPlugin.gradle 实现了 Plugin 接口。该插件还依赖于 osdetector-gradle-plugin

我将这两个 gradle 文件放在一起,然后尝试将 myPlugin 应用到 build.gradle 中,如下所示:

apply from: 'myPlugin.gradle'

然而,在myPlugin.gradle文件中出现了以下错误:
Plugin with id 'com.google.osdetector' not found

这是myPlugin.gradle文件的代码:

apply plugin: 'groovy'
apply plugin: 'maven'

  repositories {
     mavenCentral()
     mavenLocal()
  }
  dependencies {
      compile   'com.google.gradle:osdetector-gradle-plugin:1.4.0'
  }

import org.gradle.api.tasks.TaskAction
import org.gradle.api.DefaultTask
import org.gradle.api.Plugin
import org.gradle.api.Project

apply plugin: 'com.google.osdetector'
apply plugin: HostingMachineOSPlugin

class HostingMachineOSPlugin implements Plugin<Project>{
    void apply(Project project){
        project.plugins.apply("com.google.osdetector");
        //project.configurations.files('com.google.osdetector')
        println project.osdetector.os

        /* Extend the project property to have the class HostingMachineOS */
        project.ext.HostingMachineOS = HostingMachineOS
    }
}

public class HostingMachineOS {

    static family = "Unkown"

    static def setFamilyName(name){
        family = name
    }

    static def isLinux (){
        family == "linux"
    }

    static def isWindows (){
        family == "windows"
    }

    static def isMacOS(){
        family == "osx"
    }
}

HostingMachineOS.setFamilyName(osdetector.os)

build.gradle 文件中:我只是做了这样的事情:
// 定义 buildScript 的 repositories 和 dependencies,然后
apply from: 'myPlugin.gradle'

task dummy{
  println HostingMachineOS.isMacOS()
  println HostingMachineOS.isLinux()
  println HostingMachineOS.isWindows()
}

我该如何解决“找不到id为'com.google.osdetector'的插件”问题?

似乎你的 myPlugin.gradle 找不到 ID 为 com.google.osdetector 的插件,也许你应该在你的 myPlugin.gradle 中添加一个 buildscript 部分(包括适当的 repositories 部分)? - RaGe
我在myPlugin.gradle中添加了buildscript部分,但仍然出现相同的错误?主build.gradle和myPlugin.gradle中的依赖关系是否有关联? - Wael Showair
1个回答

4

这是一个常见的陷阱,要将插件添加到build.gradle文件中,您需要为构建脚本本身添加依赖项 - 而不是项目。在应用插件的文件中添加以下代码段应该可以解决问题:

buildscript {

  repositories {
     mavenCentral()
     mavenLocal()
  }

  dependencies {
     classpath 'com.google.gradle:osdetector-gradle-plugin:1.4.0'
  } 

}

编辑

请在这里查看 - 看起来如果您需要apply from第三方脚本,您需要使用完整的类名(包括包名)。因此,文件应定义如下:

build.gradle

apply from: 'myPlugin.gradle'

task dummy{
  println HostingMachineOS.isMacOS()
  println HostingMachineOS.isLinux()
  println HostingMachineOS.isWindows()
}

myPlugin.gradle

buildscript {
  repositories {
    mavenCentral()
  }
  dependencies {
    classpath 'com.google.gradle:osdetector-gradle-plugin:1.4.0'
  }
}

apply plugin: 'groovy'
apply plugin: 'maven'
apply plugin: com.google.gradle.osdetector.OsDetectorPlugin
apply plugin: HostingMachineOSPlugin

class HostingMachineOSPlugin implements Plugin<Project>{
    void apply(Project project){
        project.plugins.apply(com.google.gradle.osdetector.OsDetectorPlugin);
        //project.configurations.files('com.google.osdetector')
        println project.osdetector.os

        /* Extend the project property to have the class HostingMachineOS */
        project.ext.HostingMachineOS = HostingMachineOS
    }
}

public class HostingMachineOS {

    static family = "Unkown"

    static def setFamilyName(name){
        family = name
    }

    static def isLinux (){
        family == "linux"
    }

    static def isWindows (){
        family == "windows"
    }

    static def isMacOS(){
        family == "osx"
    }
}

HostingMachineOS.setFamilyName(osdetector.os)

你的意思是我应该将这段代码添加到myPlugin.gradle还是build.gradle中?我已经添加到了myPlugin.gradle,但仍然遇到了相同的错误。 - Wael Showair
@WaelShowair,在应用插件的文件中——据我所见是myPlugin.gradle——请注意依赖项的范围是classpath而不是compile - Opal
我将你的代码复制粘贴到了myPlugin.gradle中,但是我仍然遇到了相同的错误,有什么建议吗?顺便说一下:如果我在build.gradle的buildscript部分中添加classpath,myPlugin就可以正常工作。 - Wael Showair
@WaelShowair,我已经编辑了答案,请现在查看一下。 - Opal

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