0

現在、いくつかの異なるタスクをサポートする Thor 実行可能ファイルを構築しています。一部のタスクは、他のタスクを呼び出します。例えば

  • 認証
    • ローカルユーザーを認証します
  • 作成
    • 認証を呼び出す
    • 何かをします
    • 設定を呼び出す
  • 構成、設定:
    • 認証を呼び出す
    • 何かをします

thor の優れた点は、3 つのタスクすべてを個別に呼び出すことができるようになったことですが、たとえば、authenticate は呼び出しを介して 1 回だけ呼び出されるようにしてください。

しかし、これらのタスク間でデータを共有するための最良の方法は何ですか? たとえば、認証時に現在のユーザーのユーザー ID を設定したいとします。したがって、Web サービスからデータを要求する場合、同じ方法でコードのどこからでもユーザー ID を取得できます。

現在、モジュールを介してこれを実装していますが、これが最善の方法であるかどうかはよくわかりません。

シングルトンを使用するのも別の方法ですが、どういうわけか、これはこの目的には少し多すぎるように思えます。

おそらく、これを行うためのより良い方法の経験があるかもしれませんし、モジュールを使用することがとにかく情報を保存するための最良の方法であるかもしれません。

4

2 に答える 2

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 モジュールが必要です)。

PSコード スニペットの構造は正確ではない可能性があります。基本的なスケルトンを共有したかっただけです。残りのクラスに対して上記のようなことを行います。

于 2012-03-16T17:26:56.700 に答える
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
于 2013-10-30T13:27:14.870 に答える