Stupid question: Are patches preferred against the gem, or the svn? On 1/15/08, Jamis Buck <[EMAIL PROTECTED]> wrote: > > David, > > Interesting suggestion. I would definitely consider adding something > like that to cap. If anyone were to write up a patch and attach it to > a ticket at dev.rubyonrails.org, I'd look it over. > > In the meantime, you can probably work around it by using the :hosts > key, instead of roles, and then using procs to return the exact hosts > you want. It's more work, and it would probably wind up duplicating > some of what roles give you, but then you don't have to wait for a > patch. :) > > - Jamis > > On Jan 11, 2008, at 3:23 PM, David Masover wrote: > > > 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 -~----------~----~----~----~------~----~------~--~---