Gradle 渐变显示子项目编译配置的内容

Gradle 渐变显示子项目编译配置的内容,gradle,configuration,Gradle,Configuration,尝试显示子项目foo的配置内容: task foo { project(':foo').configurations.compile.files.each { println it.name } project(':foo').configurations.compileClasspath.files.each { println it.name } } 错误 我混淆了configurations.compile和con

尝试显示子项目foo的配置内容:

task foo {

    project(':foo').configurations.compile.files.each { 
        println it.name
    }

    project(':foo').configurations.compileClasspath.files.each { 
        println it.name
    }

}
错误

我混淆了configurations.compile和configurations.compileClasspath。它们是一样的吗?两者都是文件收集


对于当前项目(不是:foo),它们包含相同的文件集

您的问题基于与StackOverflow的大多数Gradle问题相同的技术细节:配置阶段和执行阶段之间的差异

如果定义任务(如示例中的
foo
),则以下闭包中的代码不会定义任务在执行时将执行的操作。相反,它在任务定义之后立即执行,并应用于配置任务。这就是为什么每次在项目上运行Gradle(在配置阶段)时都会执行代码的原因。另一方面,您的示例中的任务在执行时(在执行阶段),绝对不会执行任何操作。在执行阶段,仅执行任务操作(由任务类型定义)、
doFirst
doLast
闭包。还要注意,每个任务都会进行(任务)配置,但只会执行选定的任务(通过命令行或依赖项)

了解了以上内容,我们可以理解代码中的问题:它试图在根项目的配置阶段打印子项目配置的内容。子项目的配置阶段(添加依赖项)位于根项目的配置阶段(解析配置(显示内容所必需的)之后。但您不能向已解析的配置添加依赖项

这意味着您的代码将被执行,解析配置并不打印任何内容,因为在执行时配置是空的。之后,在子项目
依赖项
闭包中,您试图向已解决的配置添加依赖项,这会导致错误。注释掉子项目
foo
中的所有(
compile
)依赖项,错误就会消失

然而,这不是你想要的。您希望在添加配置文件后列出这些文件。为此,您可以轻松地将任务代码移动到
doLast
(或
doFirst
)闭包:

现在,您的配置在根项目的执行阶段得到解决,该阶段在子项目的配置阶段之后,因此添加依赖项不会有任何问题。请注意,仅当您指定该任务时才会执行该任务(例如,调用
gradle foo
/
gradle build foo
或对将执行的另一个任务使用
dependsOn foo


关于
compile
compileClasspath
配置之间的区别,您可以看看Gradle Java插件,它定义了两种配置:配置可以扩展其他配置,这意味着它们将包含其他配置包含的所有依赖项,但也可以包含其他依赖项。如果只使用
compile
依赖项,
compile
compileClasspath
将是相同的,但是,例如,
compileOnly
依赖项将仅列在
compileClasspath

下。您的问题基于与StackOverflow的大多数Gradle问题相同的技术细节:配置阶段和执行阶段之间的差异

如果定义任务(如示例中的
foo
),则以下闭包中的代码不会定义任务在执行时将执行的操作。相反,它在任务定义之后立即执行,并应用于配置任务。这就是为什么每次在项目上运行Gradle(在配置阶段)时都会执行代码的原因。另一方面,您的示例中的任务在执行时(在执行阶段),绝对不会执行任何操作。在执行阶段,仅执行任务操作(由任务类型定义)、
doFirst
doLast
闭包。还要注意,每个任务都会进行(任务)配置,但只会执行选定的任务(通过命令行或依赖项)

了解了以上内容,我们可以理解代码中的问题:它试图在根项目的配置阶段打印子项目配置的内容。子项目的配置阶段(添加依赖项)位于根项目的配置阶段(解析配置(显示内容所必需的)之后。但您不能向已解析的配置添加依赖项

这意味着您的代码将被执行,解析配置并不打印任何内容,因为在执行时配置是空的。之后,在子项目
依赖项
闭包中,您试图向已解决的配置添加依赖项,这会导致错误。注释掉子项目
foo
中的所有(
compile
)依赖项,错误就会消失

然而,这不是你想要的。您希望在添加配置文件后列出这些文件。为此,您可以轻松地将任务代码移动到
doLast
(或
doFirst
)闭包:

现在,您的配置在根项目的执行阶段得到解决,该阶段在子项目的配置阶段之后,因此添加依赖项不会有任何问题。请注意,仅当您指定该任务(例如调用
gradle foo
/
gradle build foo
或使用

* What went wrong:
A problem occurred evaluating project ':foo'.
> Cannot change dependencies of configuration ':foo:compile' after it has been resolved.
task foo {
    doLast {
        project(':foo').configurations.compile.files.each { 
            println it.name
        }
    }
}