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

Wae*_*air 5 gradle

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

myPlugin.gradle实施的插件接口。该插件还依赖于osdetector-gradle-plugin

我将两个 gradle 文件并排添加,然后尝试将 myPlugin 应用到build.gradle如下:

apply from: 'myPlugin.gradle'
Run Code Online (Sandbox Code Playgroud)

但是,我在myPlugin.gradle文件中收到以下错误:

Plugin with id 'com.google.osdetector' not found
Run Code Online (Sandbox Code Playgroud)

这是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)
Run Code Online (Sandbox Code Playgroud)

build.gradle文件中:我只是在做这样的事情:

//定义 buildScript 存储库和依赖项然后

apply from: 'myPlugin.gradle'

task dummy{
  println HostingMachineOS.isMacOS()
  println HostingMachineOS.isLinux()
  println HostingMachineOS.isWindows()
}
Run Code Online (Sandbox Code Playgroud)

如何解决未找到 ID 为“com.google.osdetector”的插件?

Opa*_*pal 4

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

buildscript {

  repositories {
     mavenCentral()
     mavenLocal()
  }

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

}
Run Code Online (Sandbox Code Playgroud)

编辑

请看这里- 似乎如果您需要apply from第三方脚本,您需要使用完整的类名(带包)。所以文件应该定义如下:

构建.gradle

apply from: 'myPlugin.gradle'

task dummy{
  println HostingMachineOS.isMacOS()
  println HostingMachineOS.isLinux()
  println HostingMachineOS.isWindows()
}
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)