从Gradle自定义插件中的某些依赖项中删除版本号

时间:2016-10-13 14:39:37

标签: gradle groovy build.gradle

我们有一个自定义插件,我们希望构建一个用于部署的特殊tar文件。我们想在某些依赖项上删除版本号。

插件的代码:

void addTarTask(Project project) {
    Tar tar = project.tasks.create("tar", Tar)
    tar.classifier = "bin"
    project.afterEvaluate {
        tar.into("${project.name}-${project.version}"){
            into('lib'){
                from project.tasks.jar
                from project.configurations.runtime 
            }

            //snip more custom requirements
        }
    }
}

我尝试过使用正则表达式从文件中删除版本的东西 - 比如:

into('lib'){
    from project.tasks.jar
    from project.configurations.runtime {
        rename '(.*)-[0-9]+\\..*.jar', '$1.jar' // not sure regex is okay - it is just to demo
    }
}

是否无法获取类型依赖项/工件对象,因此我可以跳过正则表达式并使代码更加干净。像(pseducode):

if(${artifact.extension} == "so") {
    return ${artifact.name}.${artifact.extension}
} else {
    // just return normal file
}

感谢任何帮助: - )

1 个答案:

答案 0 :(得分:2)

您引用的runtime Configuration具有dependencies属性,该属性是DependencySetDependency个对象。 这意味着您可以通过依赖项迭代来获取其名称。 您可以使用它来编写特定的重命名规则。还有一些需要考虑的注意事项。

我生成了一个示例项目,例如:

gradle init --type java-library

然后将build.gradle编辑为:

apply plugin: 'java'

repositories {
    jcenter()
}

dependencies {
    compile 'org.slf4j:slf4j-api:1.7.21'
    testCompile 'junit:junit:4.12'
}

task log << {
    configurations.runtime.allDependencies.each { println it }
    println ""
    configurations.testCompile.allDependencies.each { println it }
}

task copy(type: Copy) {
    from configurations.runtime
    into  "$buildDir/lib"
    configurations.runtime.allDependencies.each {
        rename "-${it.version}", ""
    } 
}

这具有以下结果:

[:~/tmp] % ./gradlew log copy
:log
DefaultExternalModuleDependency{group='org.slf4j', name='slf4j-api', version='1.7.21', configuration='default'}

DefaultExternalModuleDependency{group='junit', name='junit', version='4.12', configuration='default'}
DefaultExternalModuleDependency{group='org.slf4j', name='slf4j-api', version='1.7.21', configuration='default'}
[...]

[:~/tmp] % ./gradlew dependencies    
[...]
testCompile - Dependencies for source set 'test'.
+--- org.slf4j:slf4j-api:1.7.21
\--- junit:junit:4.12
     \--- org.hamcrest:hamcrest-core:1.3

[...]

[:~/tmp] % ls build/lib
slf4j-api.jar

请注意,hamcrest依赖项由gradle dependencies显示,但不会打印。这是因为在配置时没有解析依赖关系,因此gradle还不知道传递依赖关系。换句话说,您可以在插件中实现上面的复制任务,但它只适用于您在构建脚本中直接指定的依赖项。当然,如果你必须重命名其中的一些,那么你也可以明确地指定传递依赖,它仍然可以工作。 testCompile配置正确地打印了slf4j和junit,因为遵循了extendsFrom规则。