2017-09-11 1 views
1

J'ai une tâche simple Gradle:tâche Supprimer toujours-TO-DATE

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

Quand je cours, je reçois cette sortie:

:user:cleanBuild UP-TO-DATE 
BUILD SUCCESSFUL 

Total time: 1.656 secs 

J'ai lu les docs et il dit que les résultats des tâches sont mis en cache pour la performance. Je voulais relancer la tâche, mais je ne pouvais pas. Et ce malgré l'édition du code de tâche. Donc, apparemment, il semble que Gradle n'est pas capable de détecter que la tâche a été modifiée, quel genre de sucer.

J'ai essayé ce que d'autres ont recommandé, comme l'ajout de cette ligne à la tâche:

outputs.upToDateWhen { false } 

Mais il n'a pas d'effet.

+0

Qu'attendez-vous de cette tâche? – LazerBanana

+0

Je m'attends à ce que le résultat de la tâche ne soit pas mis en cache par Gradle.J'expérimente avec l'écriture d'une tâche. Auparavant, je voulais supprimer tous les fichiers (y compris les répertoires) dans l'arborescence sous la variable 'build', mais la méthode' delete' semblait supprimer uniquement les fichiers simples (pas les répertoires). – Ammaro

+0

Le résultat n'est pas mis en cache, il n'y a simplement rien à faire pour votre tâche, puisque vous n'avez spécifié aucun fichier à supprimer. Je suppose que votre arborescence de fichiers ne trouve aucun fichier. –

Répondre

2

Vous définissez une tâche du type Delete, mais vous ne définissez aucun fichier à supprimer. C'est la raison pour laquelle votre tâche est toujours à jour, puisqu'elle n'a rien à faire. Vous pouvez définir quels fichiers seront supprimés via la méthode delete. Tout ce que vous passez à cette méthode sera évaluée par Project.files(...):

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

S'il vous plaît noter que votre exemple de code ne pas interférer avec les contrôles mis à jour, il n'a même pas interférer avec la tâche du tout. Comme vous n'utilisez pas la fermeture doFirst/doLast, vous utilisez la fermeture de la configuration, qui est exécutée pendant la phase de configuration . Puisque vous n'utilisez aucune méthode de tâche, votre code signifierait absolument la même chose s'il était placé en dehors de la fermeture de la configuration de la tâche. Comme petite addition: Même si ce problème spécifique n'est pas causé par les contrôles mis à jour de Gradle, il existe un moyen de forcer Gradle à exécuter toutes les tâches en ignorant toute optimisation de tâche: Il suffit d'ajouter --rerun-tasks comme argument de ligne de commande , comme décrit dans the docs.

+0

Certes, j'ai supposé qu'il y a une tâche différente a couru avant celui-ci. – LazerBanana

1

Si vous essayez de supprimer des fichiers supplémentaires qui ne sont pas supprimés avec une tâche par défaut clean (car elle supprime uniquement les répertoires build), vous pouvez étendre la tâche de nettoyage pour supprimer également d'autres éléments.

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

Ou créer une nouvelle tâche à delete fichiers et dependOn à mettre dans le cycle de vie de construction.

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

Soyez symlinks défaut ne sera pas suivi lors de la suppression des fichiers. Pour modifier ce comportement, appelez Delete.setFollowSymlinks (boolean) avec true. Sur les systèmes qui ne supportent pas les liens symboliques, cela n'aura aucun effet. Ou vous pouvez mettre l'action dans la phase d'exécution et l'effacer.

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

Aussi, assurez-vous la tâche a quelque chose à faire parce que si la tâche n'a rien à voir, il n'y a rien à supprimer, etc, il imprimera UP-TO-DATE @ réponse de lu.koerfer explique parfaitement.

+0

Alors que l'objectif final est de supprimer certains fichiers, ce n'est pas exactement ce que je veux, cependant. Je veux que la tâche soit reprise par Gradle. – Ammaro

+0

@Ammaro si votre tâche est UP-TO-DATE, cela signifie que les sorties/entrées n'ont pas changé ou que la tâche ne fait simplement rien. – LazerBanana

+0

J'ai changé le code de la tâche, mais il dit quand même qu'il est à jour. Pourquoi donc? – Ammaro