2012-11-02 78 views
4

我按照这个指南:如何在定制gradle插件中迭代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 

的build.gradle

apply plugin: 'groovy' 

dependencies { 
    compile gradleApi() 
    groovy localGroovy() 
} 

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

group = 'com.mygroup' 
version = '1.0.0-SNAPSHOT' 

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() 

} 
    } 
    } 

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

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' 

} 

但是我怎么遍历从应用方法公地依赖于MyGradlePlugin.groovy并打印自己的坐标(的artifactId ,groupId,版本)?

+0

我假设你想通过配置'compile'的所有依赖迭代? –

回答

2

问题是依赖关系图仅在项目完全评估后才可用。这就是为什么你不能直接依靠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}" 
     } 
     } 
    } 
    } 

} 

UPDATE:继在评论问题的更新和讨论,聊天,你也可以做到以下几点:

class MyGradlePlugin implements Plugin<Project> { 

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

} 
+0

它适用于如果我不在'afterEvaluate'范围内执行此操作的情况。该插件现在已经应用在最后一步(安装后):install.doLast { 应用插件:“我-gradle这个-插件” } – u123

+0

在回答作品的代码,我用1.2的gradle测试它。在你使用install.doLast的情况下,我会说,这有点奇怪的插件用法,如果你真的只需要在安装任务后打印依赖列表,那么你可以将代码放到doLast中,为什么使用插件呢? –

+0

这样做的动机是多个项目需要应用此插件,我不想复制所有这些项目的代码。把它放到插件中可以只写一次脚本。 – u123

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"] 
    } 
}