首页 > 解决方案 > gradle WriteProperties 任务不会创建属性文件,除非直接运行该任务

问题描述

我正在尝试在非 Android Java 项目中生成属性文件,但由于某种原因,即使在我使用构建项目./gradlew assembleDist或使用它运行时任务运行./gradlew foo:run,也不会创建属性文件。该任务在子项目中定义,如下所示:

task writeProperties(type: WriteProperties) {
    outputFile 'src/main/resources/foo.properties'
    property 'version', version
    property 'releaseType', releaseType
    property 'date', date
    println("task ran")
}

task ran当我执行其他 gradle 任务时打印出来,表明任务已运行,但foo.properties指定路径中没有显示文件。奇怪的是,如果我writeProperties直接使用 运行任务./gradlew foo:writeProperties,文件将被创建并填充正确的变量。

我试过用上面的语句包装doFirst{}doLast{}但我得到如下错误:

Cause: path may not be null or empty string. path='null'

有谁知道我做错了什么?几个小时以来,我一直在努力解决这个问题,但我的想法已经不多了。谢谢!

更新:我设法用接受的答案中提供的信息解决了这个问题。我必须添加compileJava.finalizedBy(writeProperties)才能让任务作为构建任务的一部分实际运行。正如上面提到的答案,println本质上是对我撒谎,因为这是在配置阶段打印的,但没有运行任务操作。

标签: javagradle

解决方案


您的代码的实际问题是您的println陈述没有说实话。任务配置闭包中的代码在配置任务时运行,而不是在执行时运行。因此,每次您从命令行运行另一个任务时,您的任务都会被配置并println写入命令行,但不会执行实际的任务操作。您应该将您的文件打包printlndoLast,以便它在.properties文件创建后实际运行。

task myTask {
    println 'task configured'
    doLast {
        println 'task executed' 
    } 
} 

如果您希望您的任务在没有在命令行中指定的情况下运行,您需要使用dependsOn或设置任务依赖项finalizedBy


推荐阅读