Gradle exec任务始终运行,即使输入==输出

时间:2019-05-22 20:12:22

标签: gradle

我有一个创建目录的简单gradle任务

task foo(type: Exec) {
    inputs.dir 'foo'
    outputs.dir 'foo'

    commandLine 'mkdir', 'foo'
}

问题是每次我运行任务foo时,它总是运行。我希望它第一次运行,然后意识到该目录存在,就不会再次运行。我想念什么?

此外,如果foo目录不存在,第一次出现这种情况怎么办?

2 个答案:

答案 0 :(得分:0)

TaskInputs.dir()方法的描述是:

  

在给定目录下找到的所有文件都被视为此任务的输入文件。

所以我想根本不检查目录是否存在,而仅检查目录中的文件是否更改。

但是,有一个简单的解决方法。只需在任务上使用onlyIf闭包即可指定何时跳过它:

task foo(type: Exec) {
    onlyIf { file('foo').exists() }

    commandLine 'mkdir', 'foo'
}

在我的示例中,我仅使用了一个Exec任务,以使其尽可能接近您的问题,但请注意,Gradle确实提供了一种方法mkdir(),该方法比调用命令行更可取工具。请记住要在doFirstdoLast闭包内执行它,因为否则将在配置阶段内调用它。

还请注意,Gradle会自行创建所有必要的目录(用于Copy任务等),因此仅在极少数情况下才需要手动创建目录。

答案 1 :(得分:-1)

这是一个简单的解决方案。
在任务中使用常规脚本创建文件夹。

task foo {
    def folder = new File("foo")

    // If it doesn’t exist, create a directory.
    if( !folder.exists() ) {
        folder.mkdirs()
    }
}