Créé dynamiquement des tâches de type de Copie est toujours UP-to-DATE
Je vous ai préparé un script très simple, qui illustre le problème que je vois à l'aide de Gradle 1.7 (besoin de rester avec elle à cause de certains plugins pas encore l'appui des versions plus récentes).
Je suis en train de créer dynamiquement des tâches dont chacune correspond à un fichier dans le répertoire du projet. Cela fonctionne bien, mais les tâches que je dois créer jamais exécuté dès que je leur en attribuer type "Copie".
Voici mon problème build.gradle
:
file('templates').listFiles().each { File f ->
//THIS LINE DOES NOT WORK
task "myDist-${f.name}" (type: Copy) {
//NEXT LINE WORKS
//task "myDist-${f.name}" {
doLast {
println "MYDIST-" + f.name
}
}
}
task distAll(dependsOn: tasks.matching { Task task -> task.name.startsWith("myDist")}) {
println "MYDISTALL"
}
defaultTasks 'distAll'
de cette façon, mes tâches ne soit pas exécutée lorsque j'appelle de la tâche par défaut en appelant simplement gradle
:
MYDISTALL
:myDist-template1 UP-TO-DATE
:myDist-template2 UP-TO-DATE
:distAll UP-TO-DATE
BUILD SUCCESSFUL
Si je supprimer le type Copy
de ma dynamique de la tâche (décommentant la ligne ci-dessus), mes tâches sont exécutées:
MYDISTALL
:myDist-template1
MYDIST-template1
:myDist-template2
MYDIST-template2
:distAll
BUILD SUCCESSFUL
(Vous aurez besoin de créer un nom de dossier templates
dans le même répertoire où build.gradle
est situé et mettre quelques fichiers vides en y pour exécuter le test)
Selon la sortie de débogage:
Sauter tâche": myDist-template1 " comme il y a pas de fichiers source.
Sauter tâche": myDist-template2 " comme il y a pas de fichiers source.
Alors, comment puis-je spécifier les fichiers source et de faire mes Copy
tâches de s'exécuter?
J'ai essayé d'ajouter
from( '/absolute/path/to/existing/file' ) {
into 'myfolder'
}
à la tâche corps, j'ai essayé de l'attribution de la tâche inputs.source file('/my/existing/file')
, sans succès.
Pourriez-vous nous conseiller sur la façon de modifier mon script simple de quitter dynamique de création de tâches et de garder ma dynamique de tâches de type Copy
?
Merci!
Edit:
Tout à droite, de cette façon, la tâche est appelée:
file('templates').listFiles().each { File f ->
task "myDist-${f.name}" (type: Copy) {
from f
into 'dist'
doLast {
println "MYDIST-" + f.name
}
}
}
mais il semble que je me doit toujours spécifier from
/into
. Il ne suffit pas de le faire dans la doLast{} corps.
OriginalL'auteur Sergey Shcherbakov | 2013-11-27
Vous devez vous connecter pour publier un commentaire.
Un
Copy
tâche sera exécuté si il a quelque chose à copier. Dire que la copie est une partie de la configuration de la tâche, et donc qui doit être fait dans le phase de configuration, plutôt que de la phase d'exécution. Ce sont des concepts très importants pour comprendre, et vous pouvez lire dans le Gradle Guide De L'Utilisateur ou sur le Gradle Forums.doFirst
etdoLast
blocs exécutés dans la phase d'exécution, dans le cadre de l'exécution de la tâche. Les deux sont trop tard pour dire à la tâche qu'à copier:doFirst
est exécuté immédiatement avant la tâche principale de l'action (qui dans ce cas est la copie), mais (un peu) après laskipped
etup-to-date
contrôles (qui sont basés sur la tâche de configuration).doLast
est exécuté après la tâche principale de l'action, et n'est donc clairement trop tard.OriginalL'auteur Peter Niederwieser
Je pense que le suivant Gradle Guide de l'Utilisateur de devis répond à ma question le meilleur:
project.copy
de la méthode et des inconvénients sur leCopy
tâche. Il n'est pas lié à votre problème.Eh bien.. il est en fait liées. Depuis mon véritable problème est que j'ai essayé de copier dans le doLast bloc d'une "Copie" de la tâche (l'exemple que j'ai fourni ne contient pas de que et est très simplifiée) et la tâche n'a pas été déclenché à cause du manque des sources d'entrée définition. J'ai déménagé de la copie de la doLast bloc et 'm heureux en ce moment 🙂 Merci pour l'aide!
Pas sûr de ce que exactement ce que vous voulez dire par "j'ai déménagé de la copie de la doLast bloc".
J'utilise en fait le gradle TR / min plugin (qui fournit une tâche de type Copie) et au lieu de tâche "distRpm${templ}" (type: Tr / min, dependsOn: xxx) {...... avait la tâche "distRpm${templ}" (type: Tr / min, dependsOn: xxx) << { à partir de ... à ... (c'est ce que j'ai appelé "déplacé")
Votre ancien code était configuration de la tâche dans un
doLast
d'action, qui, comme je l'ai expliqué, il est trop tard. (Cela n'a rien à voir avec laproject.copy
méthode.) Maintenant, vous êtes à la configuration de la tâche dans la phase de configuration, ce qui est correct.OriginalL'auteur Sergey Shcherbakov
Avoir lu la plupart des réponses à des "UP-to-DATE" Copie tâches dans gradle, il semble que la partie manquante est 'include' mot-clé:
OriginalL'auteur Tosha
Mettre
from
etinto
dans le cadre de ladoLast
section ne fonctionne pas. Un exemple d'une tâche de travail définitions:Pas le comportement que j'attendais.
À l'aide de gradle 3.2.1
def dockerFile = 'src/main/docker/Dockerfile'
?Je n'ai, mis à jour, merci!
OriginalL'auteur Miguel Reyes