我目前正在构建支持多种不同任务的Thor可执行文件。某些任务会引发其他任务。例如
关于thor的好处是我现在可以单独调用所有这三个任务,但是请确保例如只通过调用调用一次身份验证。
但是现在什么是在这些任务之间共享数据的最佳方式。例如,在Authenticating我想要设置当前用户的User-ID时。因此,当我想从我们的web服务请求数据时,我可以从代码中的任何位置获取用户ID。
现在我正在通过模块实现这一点,但我不确定这是否是最好的方法。
使用Singleton将是另一种方式,但不知何故,这似乎有点太多了。
也许你们有更好的方法可以做到这一点,或者使用模块是保存信息的最佳方式。
答案 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