1

Rake (および Make) のような Thor には、タスク管理機能があります。タスクを複数回呼び出すと、タスクは実質的に 1 回だけ呼び出されます。タスクを複数回呼び出すにはどうすればよいですか?

ハッシュを変更しようとしまし@_invocationsたが、うまくいきませんでした:

require 'csv'
require './config/environment'

class MisReport < Thor

  desc "all", "generate mysql and postgres mis"
  def all
    generate("pg_mis_report", "pg")
    generate("mysql_mis_report", "mysql") 
  end

  desc "generate", "generate mis report"
  def generate(file_name = "mis_report_#{Time.now.to_s(:number)}", connection = "postgres") 
    if connection == "pg"
      puts "== postgres database"
      ActiveRecord::Base.establish_connection :development_mysql
    else
      puts "== mysql database"
      ActiveRecord::Base.establish_connection :development
    end

    # generate MIS

    puts
    puts "mis file is at: #{file_path}"
  end

end
4

3 に答える 3

0

Thor docs を調べたところ、同じタスクを複数回強制的に呼び出す方法が見つかりませんでした。これはおそらく設計によるものです。

レポート生成リクエストを単一のタスクに結合することで、Thor が非タスク メソッドで使用できるようにする「no_task」ブロックに依存する回避策を作成しました。に渡されるハッシュ引数にレポートを追加することで、生成される新しいレポートを柔軟に追加できますgenerate

class MisReport < Thor

  desc "all", "generate mysql and postgres mis"
  def all
    generate({:pg_mis_report => "pg", :mysql_mis_report => "mysql"})
  end

  desc "generate", "generate mis report"
  def generate(hash)
    hash.each_pair {|file_name, connection| generate_report(file_name.to_s, connection)}
  end

  no_tasks{
    def generate_report(file_name = "mis_report_#{Time.now.to_s(:number)}", connection = "postgres") 

      if connection == "pg"
        puts "== postgres database"
        #ActiveRecord::Base.establish_connection :development_mysql
      else
        puts "== mysql database"
        #ActiveRecord::Base.establish_connection :development
      end

      # generate MIS

      file_path = "/some/path/to/#{file_name}"
      puts
      puts "mis file is at: #{file_path}"
    end
  }

end

私はそれをテストし、出力はここに示されています:

$> thor mis_report:all
== postgres database

mis file is at: /some/path/to/pg_mis_report
== mysql database

mis file is at: /some/path/to/mysql_mis_report

お役に立てれば。

于 2012-10-06T16:26:33.790 に答える