2017-09-11 46 views
1

我在搖籃已經一個簡單的任務:刪除任務總是UP-TO-DATE

task cleanBuild(type: Delete) { 
    def build = ".src/buildfiles" 
    FileTree tree = fileTree (dir: dbEditorBuild); 
    tree.each { File file -> 
     println file 
    } 
} 

當我運行它,我得到這個輸出:

:user:cleanBuild UP-TO-DATE 
BUILD SUCCESSFUL 

Total time: 1.656 secs 

我讀過的文檔它說任務結果被緩存以獲得性能。我想重新執行任務,但我不能。儘管編輯了任務代碼,所以,很明顯,Gradle似乎無法檢測到任務已經改變,哪種吸吮。

我試過推薦別人,像添加此行的任務是:

outputs.upToDateWhen { false } 

但它不會有任何效果。

+0

你認爲該任務做什麼? – LazerBanana

+0

我期待任務結果不被Gradle緩存。我正在嘗試編寫一個任務。以前,我想刪除變量'build'下樹中的所有文件(包括目錄),但'delete'似乎只刪除純文件(而不是目錄)。 – Ammaro

+0

結果未被緩存,因爲您沒有指定任何要刪除的文件,因此您的任務完全沒有任何操作。我假設你的文件樹根本找不到任何文件。 –

回答

2

您可以定義類型爲Delete的任務,但不會定義任何要刪除的文件。這就是爲什麼你的任務總是最新的原因,因爲它沒有任何關係。您可以定義通過delete方法刪除哪些文件。你通過這種方法,一切都會通過Project.files(...)進行評估:

task myDelete(type: Delete) { 
    delete 'path/to/file', 'path/to/other/file' 
} 

請注意,您的代碼示例不與上最新的檢查干擾,它甚至不與任務干擾的。由於您未使用閉包,因此您正在使用任務的配置關閉,該任務在配置階段期間執行。由於您也沒有使用任何任務方法,因此如果將代碼置於任務配置關閉之外,則代碼將完全相同。

作爲一個小的補充:即使這個特定的問題不是由Gradle最新的檢查引起的,也可以強制Gradle執行所有任務,忽略任何任務優化:只需將--rerun-tasks作爲命令行參數如the docs中所述。

+0

的確,我認爲在這之前有一個不同的任務。 – LazerBanana

1

如果您嘗試刪除一些未使用默認clean任務刪除的其他文件(因爲它只刪除build目錄),則可以擴展清理任務以刪除其他內容。

clean { 
    delete += "$buildDir" 
    delete += "$rootDir/someDir/someClass.java" 
    delete += "$rootDir/otherDir 
} 

或創建新任務delete文件和dependOn它放在構建生命週期。

task deleteSomething(type: Delete) { 
    // to delete a file 
    delete 'uglyFolder', 'uglyFile' 
    // to delete a directory 
    delete 'uglyFolder' 
    followSymlinks = true 
} 

是默認的符號鏈接不會被刪除文件時遵循。要更改此行爲,請使用true調用Delete.setFollowSymlinks(boolean)。在不支持符號鏈接的系統上,這將不起作用。

或者您可以將操作置於執行階段並刪除它。

task cleanBuild { 
    def build = new File("$rootDir/src/buildfiles") 
    doLast{ 
     build.deleteDir() 
    } 
} 

而且,可以肯定的任務有東西,因爲如果做任務無關,沒有什麼可刪除等將打印UP-TO-DATE @ lu.koerfer答案解釋它完美。

+0

儘管最終目標是刪除一些文件,但這並不完全是我想要的。我想讓這個任務再次由Gradle運行。 – Ammaro

+0

@Ammaro如果你的任務是UP-TO-DATE,這意味着輸出/輸入沒有改變或任務完全沒有任何改變。 – LazerBanana

+0

我改變了任務代碼,但它仍然說它是最新的。這是爲什麼? – Ammaro