The task call frames are used primarily for rolling back (on rollback, that stack is walked). Also, it lets you programmatically infer which task is currently being executed. As far as I can remember, nothing in Capistrano itself should "break" if you are invoking the task directly, but there might be third-party extensions that depend on the task always existing in the call frame stack.
- Jamis On 5/12/09 9:07 AM, Emily wrote: > Thanks so much for the quick response. Unfortunately, magical is > exactly what I need, so it looks like I'll be using > 'invoke_task_directly_without_callbacks'. I tested it, and it seems to > work exactly the way I need. Am I going to break anything by not > having the task added to the task call frame? I'm not sure of its > function, and noticed that execute_task adds that around > invoke_task_directly. > > Thanks for the help, > Emily > > On May 12, 10:19 am, Jamis Buck<[email protected]> wrote: >> Looks like the documentation is ambiguous. What it means is, that >> particular version of the method doesn't invoke the callbacks. However, >> Capistrano also loads the "Callbacks" module (capistrano/callbacks.rb), >> which overrides the invoke_task_directly method to decorate it with the >> callback calls. >> >> So, you have two options. >> >> First, you can call the task via >> "invoke_task_directly_without_callbacks" (which is what the original >> method is aliased to when the callbacks are added). >> >> Second (and this option is cleaner, I think, but only works when you >> have control over the tasks being invoked): write the target task as a >> vanilla Ruby method, first, and then have the tasks call the method. E.g. >> >> def do_foo >> puts "foo!" >> end >> >> task :say_foo_without_bar do >> do_foo >> end >> >> task :say_foo do >> do_foo >> end >> >> task :say_bar do >> puts "bar!" >> end >> >> after :say_foo, :say_bar >> >> It takes a little more planning, but it's less magical, and less >> dependent on internal Capistrano methods. >> >> - Jamis >> >> On 5/12/09 8:02 AM, Emily wrote: >> >> >> >>> I'm working on a complex Capistrano recipe that requires being able to >>> run a task without callbacks. After some searching through source and >>> rdocs, it seems that "execute_task" is the intended way to do this. >>> The documentation states that it "executes the task with the given >>> name, without invoking any associated callbacks." However, when I run >>> a task with execute_task, its callbacks are executed. I also tried >>> using invoke_task_directly, which is what execute_task calls >>> internally, and that also runs callbacks. Am I misunderstanding the >>> purpose of execute_task? Is there some other method I should be using? >>> I'm including a minimal Capfile which demonstrates the problem I'm >>> having along with the results I'm getting and the results I'm >>> expecting. >>> I've spend a little bit of time trying to figure out what's happening >>> with this in the ruby debugger, but with all the meta-programming >>> going on in Capistrano, I had a hard time figuring out what's actually >>> happening. So I thought that before I spend a whole day digging >>> through the source code, I'd see if perhaps anyone else had >>> experienced something similar or if I was misinterpreting what >>> execute_task is supposed to do. >>> Thanks in advance for your help, >>> - Emily >>> The capfile: >>> task :say_foo_without_callback do >>> t = top.find_task 'say_foo' >>> execute_task t >>> end >>> task :say_foo do >>> puts 'foo!' >>> end >>> task :say_bar do >>> puts 'bar!' >>> end >>> after :say_foo, :say_bar >>> Output from 'cap say_foo': >>> * executing `say_foo' >>> foo! >>> triggering after callbacks for `say_foo' >>> * executing `say_bar' >>> bar! >>> Output from 'cap say_foo_without_callback': >>> * executing `say_foo_without_callback' >>> * executing `say_foo' >>> foo! >>> triggering after callbacks for `say_foo' >>> * executing `say_bar' >>> bar! >>> What I would expect from 'cap say_foo_without_callback': >>> * executing `say_foo_without_callback' >>> * executing `say_foo' >>> foo! > > --~--~---------~--~----~------------~-------~--~----~ To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/capistrano -~----------~----~----~----~------~----~------~--~---
