Я потратил немного времени на то, чтобы получить огурец для выполнения граблей, поэтому решил поделиться своим подходом. Примечание: это использует Ruby 2.0.0 и Rake 10.0.4, но я не думаю, что поведение изменилось с предыдущих версий.
Это две части. Первый прост: с правильно настроенным экземпляром Rake::Application
, тогда мы можем получить доступ к задачам по нему, вызвав #[]
(например, rake['data:import']
). Когда у нас есть задача, мы можем запустить ее, вызвав #invoke
и передав аргументы (например, rake['data:import'].invoke('path/to/my/file.csv')
.
Вторая часть более неловкая: правильно настроить экземпляр Rake::Application
для работы. После того, как мы сделали require 'rake'
, у нас есть доступ к модулю Rake
. У него уже есть экземпляр приложения, доступный с Rake.application
, но он еще не настроен - он не знает ни о одной из наших задач по рейку. Однако он знает, где найти наш Rakefile, при условии, что мы использовали одно из стандартных имен файлов: rakefile
, Rakefile
, rakefile.rb
или Rakefile.rb
.
Чтобы загрузить rakefile, нам просто нужно вызвать #load_rakefile
в приложении, но прежде чем мы сможем это сделать, нам нужно вызвать #handle_options
. Вызов #handle_options
заполняет options.rakelib
значением по умолчанию. Если options.rakelib
не установлено, то метод #load_rakefile
будет взорван, поскольку он ожидает, что options.rakelib
будет перечислимым.
Вот помощник, с которым я закончил:
module RakeHelper
def run_rake_task(task_name, *args)
rake_application[task_name].invoke(*args)
end
def rake_application
require 'rake'
@rake_application ||= Rake.application.tap do |app|
app.handle_options
app.load_rakefile
end
end
end
World(RakeHelper)
Вставьте этот код в файл в features/support/
, а затем просто используйте run_rake_task
в своих действиях, например:
When /^I import data from a CSV$/ do
run_rake_task 'data:import', 'path/to/my/file.csv'
end