Thanks, I didn't know about that. However... I'm looking for something more like this:
role :foo, do ... end task :bar, :roles => :foo ... end That's actually what I implemented in what I sent in, because I couldn't find it. Can "defer" work in a similar way? Because it also allows: task :baz, roles => :foo ... end task :yetAnotherTask, roles => :foo ... end task :mixAndMatch, roles => :foo, :bar ... end Basically, it's not that I don't know which roles I want ahead of time. It's that I have a role that I do know about, very specifically (could be :web, :files, etc), but that I don't necessarily know which servers it will use. On 1/11/08, Jamis Buck <[EMAIL PROTECTED]> wrote: > > David, > > Perhaps I'm not understanding what you're mean, but the current > version of Capistrano allows you to do things like this: > > task :foo, :roles => defer { something_that_computes_roles } do > end > > The "defer" method is just an alias for lambda that Capistrano adds. > The block there just needs to return the name of a role (or an array > of role names). That block is then evaluated at the moment that the > task is run. > > - Jamis > > On Jan 11, 2008, at 1:29 PM, David Masover wrote: > > > > > Working on a way to use Capistrano to deploy to ec2. I know about > > Capsize, but decided that I didn't want to hardcode image and instance > > IDs anywhere -- particularly as Capistrano itself will eventually be > > creating those itself. > > > > The first roadblock was: I can use variables-as-blocks to define > > things like the list of current instances, the latest instance, etc. > > (Variables, not functions or tasks, because I figure that information > > isn't going to change over the course of a single invocation of cap, > > unless I change it myself.) > > > > But I cannot define roles-as-blocks, and I want to find roles out from > > the results of ec2-describe-instances (and probably other things as > > well). So, I needed dynamic roles. > > > > I'm completely new to the Rails and Capistrano community, so I'm not > > sure what style conventions I should use, where to send patches, etc. > > Here's the hack I have so far: > > > > Capistrano::Configuration::Roles.module_eval do > > alias_method :orig_role, :role > > def role(which, *args, &block) > > if !block_given? && args.empty? || block_given? && > !args.empty? > > raise ArgumentError, "you must specify exactly one > of either a > > value or a block" > > end > > if block_given? then > > which = which.to_sym > > @roles[which] = block > > else > > # I apologize for this one-liner > > orig_role(which, args.map{|item| String === item ? > > Capistrano::ServerDefinition.new(item) : item}) > > end > > end > > end > > > > Capistrano::Configuration::Servers.module_eval do > > alias_method :find_servers_orig, :find_servers > > def find_servers(options={}) > > hosts = server_list_from(ENV['HOSTS'] || options[:hosts]) > > > > if hosts.any? > > hosts.uniq > > else > > roles = role_list_from(ENV['ROLES'] || > options[:roles] || > > self.roles.keys) > > roles.each { |role| > > target = self.roles[role] > > if target.respond_to?(:call) > > self.roles[role] = target.call.map{ > > |server| > > String === server ? > ServerDefinition.new(server, {}) : server > > } > > end > > } > > find_servers_orig(options) > > end > > end > > end > > > > > > > --~--~---------~--~----~------------~-------~--~----~ To unsubscribe from this group, send email to [EMAIL PROTECTED] For more options, visit this group at http://groups.google.com/group/capistrano -~----------~----~----~----~------~----~------~--~---