通过几项Thor任务共享全局数据的最佳实践

时间:2012-03-16 12:00:22

标签: ruby executable share thor global-state

我目前正在构建支持多种不同任务的Thor可执行文件。某些任务会引发其他任务。例如

  • 验证
    • 验证本地用户
  • 创建
    • 调用Auth
    • 做点什么
    • 调用配置
  • 配置:
    • 调用Auth
    • 做点什么

关于thor的好处是我现在可以单独调用所有这三个任务,但是请确保例如只通过调用调用一次身份验证。

但是现在什么是在这些任务之间共享数据的最佳方式。例如,在Authenticating我想要设置当前用户的User-ID时。因此,当我想从我们的web服务请求数据时,我可以从代码中的任何位置获取用户ID。

现在我正在通过模块实现这一点,但我不确定这是否是最好的方法。

使用Singleton将是另一种方式,但不知何故,这似乎有点太多了。

也许你们有更好的方法可以做到这一点,或者使用模块是保存信息的最佳方式。

2 个答案:

答案 0 :(得分:1)

我会做这样的事情:

module PRJ

  class << self
    attr_accessor :api_key, :account_name, :api_version, :api_url, ......

    def configure
     yield self
    end
  end

end

require "#{directory_of_all_other_classes}"

require 'thor'

class CLI < Thor
include Thor::Actions

def login
  ...
  PRJ.api_key = response[:api_key] 
end

由于您想在每种情况下调用Auth,所以我认为它应该在主CLI文件中。

关于存储和使用数据,最好使用属性而不是常量。我对此可能不对,但我更喜欢使用类属性。

现在您可以从任何地方访问和更改PRJ.api_key(在每个文件中都需要PRJ模块)

P.S。代码段的结构可能不准确,我只是想分享一些基本的骨架。为剩下的课做上面的事情。

答案 1 :(得分:0)

如果你只需要存储简单的数据结构,我会选择常见的类变量

class Test < Thor
  @@my_shared_var = nil 

  desc 'my_first_task','sdfasdf'
  def my_first_task
    @@my_shared_var = 'foo'
  end

  desc 'my_second_task','sdfasdf'
  def my_second_task
    invoke :my_first_task
    puts @@my_shared_var
  end

end