如何从 ruby 中的
Rake
任务返回一些值。
示例代码:
namespace tasks
task task1: :environment do |task|
log = "Running task"
puts log
log << "Done"
return log # suggest how to do this
end
end
我正在运行 rake 任务:
Rake::Task['tasks:task1'].invoke
。如何获取变量中的返回值,如下所示:
result = Rake::Task['tasks:task1'].invoke
假设您希望该任务结果出现在其他任务中:
config = ''
task :load_config do
config = 'some config' # this could be reading from a file or API
end
# this tasks depends on the other
task use_config: [:load_config] do
puts config
end
然后:
$ bundle exec rake use_config
some config
根据您尝试返回的内容,您可以尝试使用错误消息中止任务,该错误消息可以从您调用任务的位置“捕获”。然后您就可以看到错误消息是什么。
您的任务
namespace :tasks
task task1: :environment do |task|
log = "Running task... "
puts log
log << "Done!"
abort( log )
end
end
运行您的任务
begin
Rake::Task[ "tasks:task1" ].invoke
rescue SystemExit => exit
puts exit.message #=> "Running task... Done!"
end
它并不完全优雅,但根据您想要返回的内容,它可以满足您的需求。
action
。使用@vigo的例子,因为它很简单。
task :return_a_value do
'123'
end
result = Rake::Task['return_a_value'].actions.first.call
puts result #=> "123"
我通过在控制台中挖掘 Rake 任务的各种方法发现了这一点,这似乎不需要运行任务两次就可以工作,就像@vido 的答案一样。
但是,我发现的唯一警告是我无法弄清楚如何使用此方法将参数传递给 Rake 任务。使用
.call( "myargument" )
不起作用。如果您能弄清楚如何做到这一点,如果您分享它,我将不胜感激。谢谢!
经过更多的实验,我弄清楚了如何在向 Rake 任务传递参数时使用此方法。您只需传递参数中的
Hash
作为第二个参数,并将 nil
作为第一个参数,如下所示:
task :return_a_value, :mystring do
mystring
end
result = Rake::Task['return_a_value'].actions.first.call( nil, { mystring: "hellow there" } )
puts result #=> "hellow there"
它还有一个额外的好处,就是可以对传递给 Rake 任务的参数进行命名,这是一个很好的好处。
您可以使用代码退出 rake 任务,然后使用 $ 进行检查?
但也许 rake 可能并不是真正适合这项工作的工具。
task :return_a_value do
'123'
end
task :hello do
result = Rake::Task['return_a_value'].invoke.first.call
puts result
end
现在致电:
$ rake hello
123