【问题标题】:Gradle println prints when it is not calledGradle println 不被调用时打印
【发布时间】:2023-04-21 18:52:01
【问题描述】:

我的目标是在运行idea 任务时将消息打印到控制台,但不幸的是,无论何时运行任何内容都会打印该消息。为什么在idea 任务未运行时执行打印行?如何仅在执行idea 任务时显示消息?

build.gradle

apply plugin: 'idea'

task hello << {
    println 'Hello world!'
}

tasks.idea() {
    println '*********************************************************'
    println '* You should open build.gradle as a native project from *'
    println '* within IntelliJ.                                      *'
    println '*********************************************************'
}

命令gradle hello的输出

*********************************************************
* You should open build.gradle as a native project from *
* within IntelliJ.                                      *
*********************************************************
:hello
Hello world!

BUILD SUCCESSFUL

Total time: 2.846 secs

工作解决方案

tasks.getByPath('idea') << {
    println '*********************************************************'
    println '* You should open build.gradle as a native project from *'
    println '* within IntelliJ.                                      *'
    println '*********************************************************'
}

【问题讨论】:

标签: gradle


【解决方案1】:

您需要将您的printlns 放入一个操作中并将其添加到idea 任务中。以下示例显示了doFirst 操作的使用:

ideaProject.doFirst {
    println '*********************************************************'
    println '* You should open build.gradle as a native project from *'
    println '* within IntelliJ.                                      *'
    println '*********************************************************'
}

在运行idea 任务之前执行您的代码有一个特定的原因:它被评估为在Gradle's build lifecycle 的配置阶段执行的配置代码。在执行阶段只执行动作。您的 hello 任务就是这样做的。

编辑:idea 在此上下文中是 org.gradle.plugins.ide.idea.model.IdeaModel,而不是任务。

【讨论】:

    【解决方案2】:

    如果您想强制 gradle 打印一些消息但仅在执行阶段,请将 println 命令移动到 doFirstdoLast。战争任务示例:

    war {
        doFirst {
            println "Packing module/project to " + archiveName + " ..."
        }
        manifest {
            // attributes ... 
        }
        // other commands ...
        doLast {
            println "Packing done. See target directory."
        }
    } 
    

    【讨论】: