2017-05-06 4 views
0

Si j'ai une tâche définie dans mon Rakefile qui ressemble à ceci:Existe-t-il un moyen d'attacher des puts/logs de liaison tardive aux tâches de rake?

MyLibrary::CopySrcTask.new(:copySrc) do |task| 
    puts "Copying source" 
    task.src_dir = 'src/' 
    task.destination = 'build/lib/' 
end 

Je suis venu à réaliser que le puts dans la tâche ci-dessus seront sont exécutées même si je spécifie une cible de coupe pour laquelle cette tâche :copySrc est et non exécutée. Je me demande s'il existe un moyen de spécifier le puts d'une manière tardive de sorte qu'il ne soit exécuté que si/quand la tâche rake elle-même est exécutée?

Cela peut ne pas sembler une grosse affaire, mais il serait certainement permettre le débogage plus facile, et de plus, il devient une affaire beaucoup plus si l'on considère un cas comme celui-ci:

MyLibrary::CopySrcTask.new(:copySrc) do |task| 
    task.src_dir = complex_function_which_affects_filesystem() 
    task.destination = 'build/lib/' 
end 

maintenant dans ce cas , c'est essentiellement le même problème qu'avec le puts évalué même si la tâche n'est pas exécutée, mais maintenant au lieu d'un appel puts superflu, il fait une opération entière qui salit le système de fichiers. Est-il possible de faire en sorte que tout ce code à l'intérieur de l'initialisation de la tâche ne soit exécuté que lorsque la tâche elle-même est exécutée?

Si quelque chose comme ça fonctionnerait, ce serait génial:

MyLibrary::CopySrcTask.new(:copySrc) do |task| 
    lambda do # this code will only be run if the task gets run 
    puts "Copying source" 
    task.src_dir = complex_function_which_affects_filesystem() 
    task.destination = 'build/lib/' 
    end 
end 

Je note que la tâche que je me sers est d'une bibliothèque, donc je ne peux pas modifier la tâche elle-même.

Répondre

0

C'est la solution/pirater j'ai trouvé qui semble fonctionner:

task :copySrc do |t| 
    MyLibrary::CopySrcTask.new(:internalCopySrc) do |task| 
    puts "Copying source" 
    task.src_dir = complex_function_which_affects_filesystem() 
    task.destination = 'build/lib/' 
    end 
    Rake::Task[:internalCopySrc].invoke 
end 

Envelopper chaque tâche bibliothèque dans une autre tâche, puis en appelant manuellement la tâche enfant ... Il est pas joli, mais ça fonctionne.