ruby 如何从rake任务返回一些值

wvmv3b1j  于 2023-10-17  发布在  Ruby
关注(0)|答案(5)|浏览(139)

如何从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
qnakjoqk

qnakjoqk1#

假设你想在其他任务中得到任务结果:

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
zpgglvta

zpgglvta2#

尝试使用错误消息中止并捕获该消息。

根据您试图返回的内容,您可以尝试使用错误消息中止任务,这将是从您调用任务的位置“可捕获”的。然后,您可以看到错误消息是什么。

您的任务

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

它并不优雅,但取决于你想返回什么,它可以满足你的需求。

ssm49v7z

ssm49v7z3#

直接调用Rake的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任务的参数,这是一个很好的奖励。

版本

  • Rails:7.0.7
  • Ruby:3.2.2
o2gm4chl

o2gm4chl4#

你可以用代码退出rake任务,然后用$?
但也许rake并不是这项工作的合适工具。

uhry853o

uhry853o5#

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

相关问题