Search code examples
gradleandroid-gradle-pluginbuild.gradlegradlew

Gradle copy task not finding source files when leftShift (<<) operator used


I have the following gradle task in a subproject's build.gradle file to copy file.txt from a directory called from_dir/ to a directory to_dir/ and rename it to fileRenamed.txt:

task copyRenameFile(type: Copy) {
    System.out.println("copyRenameFile begin")
    from('from_dir')
    into('to_dir')
    include('file.txt')
    rename('file.txt', 'fileRenamed.txt')
    System.out.println("copyRenameFile end")
}

build.finalizedBy(copyRenameFile)

When I run gradlew :subprojectname:build, this task performs the copy as expected after the build task is finalized, but it executes the printlns during the configuration phase, before the build task.

In an attempt to make the printlns appear after the build phase when the copy is actually being executed, I tried using the << operator like so:

task copyRenameFile(type: Copy) << {

But this results in the task beings skipped with the following message:

[INFO] [org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter] Skipping task ':subprojectname:copyRenameFile' as it has no source files.

Does this mean file.txt could not be found during the execution phase? Why?

EDIT: After reading this answer, I now understand that my usage of the << operator is causing the configuration phase to skip this task and this is the reason the source files are not found. So I guess I can't use the << operator, but how else can I make the printlns occur when the task is being executed and not when it is being configured?


Solution

  • I figured it out:

    task copyRenameFile(type: Copy) {
        doFirst{
            System.out.println("copyRenameFile begin")
        }
    
        from('from_dir')
        into('to_dir')
        include('file.txt')
        rename('file.txt', 'fileRenamed.txt')
    
        doLast{
            System.out.println("copyRenameFile end")
        }
    }
    
    build.finalizedBy(copyRenameFile)
    

    I got rid of the << and instead used doFirst and doLast to ensure my printlns occured during the execution phase.