module Rake
Rote
adds the following methods to the Rake
module. All this cool stuff was contributed by Jonathan Paisley (<jp-www at dcs gla ac uk>)
Public Class Methods
# File lib/rote/cache.rb 31 def cache_dir; @cache_dir ||= ".rake_cache"; end
Directory for storing Rake
dependency cache
# File lib/rote/cache.rb 30 def cache_dir=(val); @cache_dir = val; end
Enable or disable dependency caching.
# File lib/rote/cache.rb 49 def cache_enabled=(b); @cache_enabled = b; end
Determine whether dependency caching is enabled
# File lib/rote/cache.rb 40 def cache_enabled? 41 if @cache_enabled.nil? 42 @cache_enabled = !ENV['NO_RAKE_CACHE'] 43 else 44 @cache_enabled 45 end 46 end
Hash of current cached dependencies
# File lib/rote/cache.rb 34 def cached_dependencies; @cached_dependencies ||= {}; end
Reference to current task being executed
# File lib/rote/cache.rb 38 def current_task; task_stack.last; end
# File lib/rote/cache.rb 32 def dependencies_file; File.join(cache_dir,"dependencies.yaml"); end
Use this method to dynamically register one or more files as dependencies of the currently executing task (or the specified task if non-nil).
# File lib/rote/cache.rb 54 def register_dependency(deps, task = nil) 55 task = (current_task.name if current_task) unless task 56 if task then 57 file task => deps 58 (cached_dependencies[task] ||= []) << deps 59 end 60 end
Array representing current tasks being executed
# File lib/rote/cache.rb 36 def task_stack; @tasks ||= []; end
Protected Class Methods
Load cached dependencies, unless they’re already loaded. This method is called during task invocation, with the effect that cached deps are loaded from yaml on the first invoke.
An at_exit handler is installed to save the dependencies when rake exits.
# File lib/rote/cache.rb 127 def self.load_cached_dependencies 128 return unless !$CACHEDEPS_LOADED and Rake.cache_enabled? 129 130 at_exit { self.save_cached_dependencies } 131 132 return unless File.exists?(dependencies_file) 133 YAML.load(File.read(dependencies_file)).each do |task,deps| 134 deps.each do |dep| 135 register_dependency(dep, task) 136 end 137 end 138 139 $CACHEDEPS_LOADED = true 140 end
# File lib/rote/cache.rb 142 def self.save_cached_dependencies 143 return if cached_dependencies.empty? || !Rake.cache_enabled? 144 145 mkdir_p cache_dir unless File.exists?(cache_dir) 146 deps = {} 147 cached_dependencies.each do |k,v| 148 deps[k] = v.flatten.uniq 149 end 150 File.open(dependencies_file,"w") { |fp| fp.write YAML.dump(deps) } 151 end