2012-11-02 110 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"] 
    } 
}