Как вызвать Rake-задачи, определенные в стандартном Rakefile, из другого сценария Ruby? - PullRequest
14 голосов
/ 19 мая 2011

Можно ли вызвать задачу, определенную в Rakefile, а не в somefile.rake, из другого сценария Ruby?

Я надеялся, что создание нового Rake::Application автоматически загрузит Rakefile из того же каталога, но, похоже, это не так. Вот что я придумала до сих пор:

$LOAD_PATH.unshift File.dirname(__FILE__)
require 'rake'
require 'pp'

rake = Rake::Application.new
rake[:hello].invoke

Выполнение этого кода приводит к следующему:

/opt/ruby/1.9.2-p180/lib/ruby/1.9.1/rake.rb:1720:in `[]': Don't know how to build task 'hello' (RuntimeError)
from script.rb:7:in `<main>'

pp rake дает следующее:

#<Rake::Application:0x00000101118da0
 @default_loader=#<Rake::DefaultLoader:0x00000101118b20>,
 @imported=[],
 @last_description=nil,
 @loaders=
  {".rb"=>#<Rake::DefaultLoader:0x00000101118a80>,
   ".rf"=>#<Rake::DefaultLoader:0x000001011189b8>,
   ".rake"=>#<Rake::DefaultLoader:0x00000101118800>},
 @name="rake",
 @original_dir=
  "/Users/t6d/Projects/Sandbox/Ruby/rake-from-ruby-script",
 @pending_imports=[],
 @rakefile=nil,
 @rakefiles=["rakefile", "Rakefile", "rakefile.rb", "Rakefile.rb"],
 @rules=[],
 @scope=[],
 @tasks={},
 @top_level_tasks=[],
 @tty_output=false>

Как-то раздражает, что @rakefile это nil.

Обновление 20 мая, 16:40 CET

Прочитав некоторое время исходный код rake, я понял, что вам нужно вызвать Rake :: Application # init для инициализации вновь созданного приложения rake:

rake = Rake::Application.new
rake.init
rake.load_rakefile

Однако я все еще не могу вызвать задачи, определенные в моем Rakefile:

rake.top_level_tasks # => ["default"]

Я бы с удовольствием оценил любую помощь по этому вопросу.

Ответы [ 2 ]

18 голосов
/ 21 мая 2011

Вы забыли добавить свой новый rake в текущее приложение Rake:

$LOAD_PATH.unshift File.dirname(__FILE__)

require 'rake'
require 'pp'

rake = Rake::Application.new
Rake.application = rake
rake.init
rake.load_rakefile

rake[:hello].invoke

или просто

$LOAD_PATH.unshift File.dirname(__FILE__)
require 'rake'
require 'pp'

Rake.application.init
Rake.application.load_rakefile

Rake.application[:hello].invoke
10 голосов
/ 18 сентября 2011

Просто загрузите Rakefile:

==> foo.rb <==
require 'rubygems'
require 'rake'

load 'Rakefile'

Rake::Task[:some_task].invoke

==> Rakefile <==
task :some_task do
  puts "some_task"
end

Rake :: Приложение - это обработка командной строки, rake-файлов по умолчанию, вывод и т. Д. Вам может не понадобиться ничего из этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...