def run (task, optional: false, quiet: false, once: nil)
      once once, quiet: quiet do
        log.info "run #{task}", quiet: quiet do
          file = find_task(task)
          code = File.read(file)
          let :@file => file do
            instance_eval(code, file)
          end
        end
      end
    rescue TaskNotFound => e
      return if optional
      raise e
    end
def run (task, optional: false, quiet: false, once: nil)
      once once, quiet: quiet do
        log.info "run #{task}", quiet: quiet do
          file = find_task(task)
          code = File.read(file)
          let :@file => file do
            instance_eval(code, file)
          end
        end
      end
    rescue TaskNotFound => e
      return if optional
      raise e
    end
Find and execute a task. For each entry in the search path, it checks for +path/task.rb+, +path/task/blow.rb+,
 and finally for bare +path/task+. The search stops at the first match.
 If found, the task is executed within the context, with +@file+ bound to the task's file name.
 @param [String] task The name of the task.
 @macro quietable
 @macro onceable
 @raise [TaskNotFound] If no task is found.
 @raise Whatever the task itself raises.
 @return The result of evaluating the task file.