Есть ли способ узнать текущую задачу рейка?

Возможно ли узнать текущую задачу рейка в ruby:

# Rakefile
task :install do
  MyApp.somemethod(options)
end

# myapp.rb
class MyApp
  def somemetod(opts)
     ## current_task?
  end
end

Изменить

Я спрашиваю о любой глобальной переменной, которая может быть запрошена по этому поводу, потому что я хотел сделать приложение умным для грабли, а не изменять сама задача. Я думаю, что приложение должно вести себя по-разному, когда оно запускается с помощью грабли.

Ответ 1

Я подумываю о том, чтобы приложение выглядело по-разному, когда его запускали rake.

Достаточно ли уже проверить caller, если он вызван из рейка, или вам нужна и какая задача?


Надеюсь, это нормально, когда вы можете изменить файл rakefile. У меня есть версия, которая вводит Rake.application.current_task.

# Rakefile
require 'rake'
module Rake
  class Application
    attr_accessor :current_task
  end
  class Task
    alias :old_execute :execute 
    def execute(args=nil)
      Rake.application.current_task = @name  
      old_execute(args)
    end
  end #class Task
end #module Rake  

task :start => :install do; end
task :install => :install2 do
  MyApp.new.some_method()
end
task :install2 do; end

# myapp.rb
class MyApp
  def some_method(opts={})
    ## current_task? -> Rake.application.current_task
    puts "#{self.class}##{__method__} called from task #{Rake.application.current_task}"
  end
end

Два замечания по этому поводу:

  • вы можете добавить изменения в rake в файл и потребовать его в вашем файле rake.
  • запуск и установка задач - это тестовые задачи для проверки, если есть более одной задачи.
  • Я делал только небольшие тесты на побочные эффекты. Я мог представить, что в реальной производственной ситуации есть проблемы.

Ответ 2

Этот вопрос задан в нескольких местах, и я не думал, что любой из ответов был очень хорош... Я думаю, что ответ заключается в проверке Rake.application.top_level_tasks, который является списком задач, которые будут выполняться. Рейк не обязательно запускает только одну задачу.

Итак, в этом случае:

if Rake.application.top_level_tasks.include? 'install'
  # do stuff
end

Ответ 3

Лучше всего использовать параметр блока

# Rakefile
task :install do |t|
  MyApp.somemethod(options, t)
end

# myapp.rb
class MyApp
  def self.somemetod(opts, task)
     task.name # should give the task_name
  end
end

Ответ 4

Задачи рейка не волшебны. Это похоже на вызов метода.

Самый простой (и ясный) способ выполнить то, что вы хотите, - просто передать задачу в функцию как необязательный параметр.

# Rakefile
task :install do
  MyApp.somemethod(options, :install)
end

# myapp.rb
class MyApp
  def somemetod(opts, rake_task = nil)
  end
end