如何在自定义gradle插件中迭代gradle依赖项?

u12*_*123 4 plugins gradle

我遵循了这个指南:

http://www.gradle.org/docs/current/userguide/custom_plugins.html

使用以下结构/文件创建独立的gradle插件:

  my-gradle-plugin
    > src
     > main
      > java
       > com
        > mygroup
         > MyGradlePlugin.groovy
    > build.gradle
    > settings.gradle
Run Code Online (Sandbox Code Playgroud)

build.gradle:

apply plugin: 'groovy'

dependencies {
  compile gradleApi()
  groovy localGroovy()
}

apply plugin: 'maven'
repositories {
  mavenCentral()
}

group = 'com.mygroup'
version = '1.0.0-SNAPSHOT'
Run Code Online (Sandbox Code Playgroud)

MyGradlePlugin.groovy:

package com.mygroup

import org.gradle.api.*

class MyGradlePlugin implements Plugin<Project> {

  void apply(Project project) {
    print " project.name " + project.name + "\n"
    print " project.dependencies " + project.dependencies + "\n"
     // How do we iterate each dependency and print artifactId, group, version??
     // project.dependencies.each {
     //        compile(it) {
     //        print it.next()
     //        print it.name
     //      }
     //    }
   project.configurations.each {
  print it.dump()

}
   }
  }
Run Code Online (Sandbox Code Playgroud)

在另一个项目中,我使用/应用此插件:

apply plugin: 'java'
apply plugin: 'maven'
apply plugin: 'eclipse'

repositories {
  mavenLocal()
}

buildscript {
  repositories {
    mavenLocal()
  }
  dependencies {
    classpath group: 'com.mygroup', name: 'my-gradle-plugin', version: '1.0.0-SNAPSHOT'
  }
}



dependencies {
  compile group: 'commons-codec', name: 'commons-codec', version: '1.4'
  compile group: 'commons-beanutils', name: 'commons-beanutils', version: '1.7.0'
}

install.doLast {
 apply plugin: 'my-gradle-plugin'

}
Run Code Online (Sandbox Code Playgroud)

但是如何从MyGradlePlugin.groovy中的apply方法迭代公共依赖并打印它们的坐标(artifactId,groupId,version)?

Mic*_*sen 5

我知道这是一个古老的问题,但由于没有选定的答案,我会抛出一个我用过的例子.这是基于gradle文档的第49.8.2.2节中的示例.

我正在使用它来执行自定义依赖项解析,但您可以在依赖项迭代中执行任何您喜欢的操作.请注意,这是有效的,因为它传递了在配置阶段之后执行的闭包.

插件代码:

package com.overtherainbow

import org.gradle.api.Project
import org.gradle.api.Plugin
import org.gradle.api.artifacts.DependencyResolveDetails

class DefaultVersionPlugin implements Plugin<Project> {

    // This is where dependency versions are defined
    def defaultVersionsMap = [
        'javax.servlet:servlet-api' : '2.5',
        'log4j:log4j' : '1.2.16']

    void apply(Project project) {
        project.configurations.all {
            resolutionStrategy.eachDependency {
                DependencyResolveDetails details -> resolveDependencyVersion(project, details)
            }
        }
    }

    def resolveDependencyVersion(Project project, DependencyResolveDetails details) {
        if (details.requested.version == 'default') {
            def version = resolveDefaultVersion(project, details.requested.group, details.requested.name)
            details.useVersion version
        }
    }

    def resolveDefaultVersion(Project project, String group, String name) {
        project.logger.debug("Resolving default dependency for $group:$name")
        println "Resolving default dependency for $group:$name"
        defaultVersionsMap["$group:$name"]
    }
}
Run Code Online (Sandbox Code Playgroud)


And*_*ich 4

问题是依赖图仅在项目完全评估后才可用。这就是为什么你不能在apply方法中直接依赖它。您必须使用该afterEvaluate方法推迟执行。下面的代码可以解决这个问题:

class MyGradlePlugin implements Plugin<Project> {

  void apply(Project project) {
    project.afterEvaluate {
      println "  Project:" + project.name
      project.configurations.each { conf ->
        println "    Configuration: ${conf.name}"
        conf.allDependencies.each { dep ->
          println "      ${dep.group}:${dep.name}:${dep.version}"
        }
      }
    }
  }

}
Run Code Online (Sandbox Code Playgroud)

更新:在评论和聊天中更新问题和讨论后,您还可以执行以下操作:

class MyGradlePlugin implements Plugin<Project> {

  void apply(Project project) {
    project.tasks.findByName('install')?.doLast {
      ...
    }
  }

}
Run Code Online (Sandbox Code Playgroud)