我刚接触Gradle,正在尝试将一个大型Maven构建版本转换到Gradle。我正在尝试调试依赖关系问题,希望打印出配置中的所有文件。这是一个多模块构建版本,我尝试在顶层或感兴趣的模块中定义任务。在这两种情况下,我都看到了任务的输出,但没有列出任何文件。
在最高层,我尝试了这样的方法:
task printFilesRoot {
dependsOn 'build'
doLast {
println "From root, printing artifacts"
project(":some-module").configurations.myconfig.allArtifacts.each { art -> println "Artifact: " + file }
println "From root, printing files"
project(":some-module").configurations.myconfig.allArtifacts.getFiles().each { file -> println "File: " + file }
}
}
在模块中,我尝试了类似的方法:
task printFilesModule {
doLast {
println "From module, printing artifacts"
configurations.myconfig.allArtifacts.each { art -> println "Artifact: " + file }
println "From module, printing files"
configurations.myconfig.allArtifacts.getFiles().each { file -> println "File: " + file }
}
}
我尝试过直接调用任务,或者使另一个任务(如build)依赖于其中一个任务。在每种情况下,我看到的唯一输出都是“打印工件”和“打印文件”语句,没有实际数据。
我想我尝试打印此数据的方式可能有问题,但问题是什么呢?我知道Gradle有两个阶段-配置和执行。我以为通过将任务代码放在“doFirst”或“doLast”块中,代码将在任务运行时执行,而不是在配置阶段执行,但我是否误解了什么?
1条答案
按热度按时间6ljaweal1#
首先,您确定需要创建自定义任务吗?
./gradlew dependencies
将列出所有子项目中的依赖项,./gradlew :some-module:dependencies
以仅运行some-module
中的任务)列出配置中的所有文件
Configuration.getAllArtifacts()
将只返回项目,而不返回依赖项。项目由项目生成,不是项目获取的依赖项。由于
Configuration
只实现FileCollection
,而FileCollection
又实现java.lang.Iterable<java.io.File>
,因此您只需迭代配置即可。(由于我对Gradle Groovy不熟悉,我改编了Gradle文档中的一个示例来构建一个fat jar。
我尝试过直接调用任务,或者使另一个任务(如build)依赖于其中一个任务。在每种情况下,我看到的唯一输出都是"打印工件"和"打印文件"语句,没有实际数据。
除了使用
getAllArtifacts()
之外,由于您使用的是名为myconfig
的自定义配置,它们可能只是空的,没有任何依赖项?最好坚持使用标准Gradle插件提供的配置(例如,Java插件创建implementation
、compileOnly
、runtimeOnly
等)。我以为通过将任务代码放在"doFirst"或"doLast"块中,代码将在任务运行时执行,而不是在配置阶段执行,但是我是否误解了什么?
不,你已经正确地定义了任务,没有问题。