From: ara.t.howard@... Date: 2006-04-27T02:29:15+09:00 Subject: Re: Rake task dependeny vs. method call On Thu, 27 Apr 2006 Ara.T.Howard@noaa.gov wrote: > but by redefining tasklib.rb to use tsort both task lists function correctly: > > > harp:~ > cat a.rb > require 'tasklib2' > > task :uidgen do |*argv| (seed = argv.shift) ? rand(seed) : > $UID||=uidgen(42) end > > task :a => :uidgen do y "a" => $UID end > task :b => :a do y "b" => uidgen(42) end > task :c => :a do y "c" => uidgen(42) end > task :d => [:b, :c] do y "d" end > > d() > > > harp:~ > ruby a.rb > --- > a: 5 > --- > b: 15 > --- > a: 5 > --- > c: 3 > --- d a sample fix: harp:~ > cat a.rb require 'tasklib2' task :uidgen do |*argv| (seed = argv.shift) ? rand(seed) : $UID||=uidgen(42) end task :a => :uidgen do y "a" => $UID end task :b => :a do y "b" => uidgen(42) end task :c => :a do y "c" => uidgen(42) end task :d => [:b, :c] do y "d" end make harp:~ > ruby a.rb --- a: 24 --- b: 25 --- c: 31 --- d harp:~ > cat tasklib2.rb require 'cache' require 'yaml' require 'tsort' module Task class TSortHash < Hash include TSort alias_method 'tsort_each_node', 'each_key' def tsort_each_child(node, &block) fetch(node).each(&block) end def initialize(hash={}) update hash end def [](key) super || [] end def fetch(key) super rescue [] end end def task(args, &action) if Hash === args raise ArgumentError, "#{args.size} for 1" if args.size != 1 name, *deps = *(args.to_a.flatten) name = name.to_sym deps = deps.compact.collect{ |e| e.to_sym } else name, deps = args.to_sym, [] end # ensure no cycles in global graph dag.replace th.update(name => deps).tsort (class<