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
-~----------~----~----~----~------~----~------~--~---