我们有一个自定义插件,我们希望构建一个用于部署的特殊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
}
感谢任何帮助: - )
答案 0 :(得分:2)
您引用的runtime
Configuration具有dependencies
属性,该属性是DependencySet个Dependency个对象。
这意味着您可以通过依赖项迭代来获取其名称。
您可以使用它来编写特定的重命名规则。还有一些需要考虑的注意事项。
我生成了一个示例项目,例如:
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
规则。