web-dev-qa-db-ja.com

GemにRakeタスクを含める

1)ジェム内にレーキタスクを行うのに最適な場所はありますか?私はそれらを/tasks/lib/tasks、および*.rbおよび*.rake-「正しい」場合、どれが正しいかわからない

2)Gemが環境で構成された後、アプリでそれらを使用できるようにするにはどうすればよいですか?

59
jsharpe

Rails 3の場合、これはRailtiesを介して行います。ここに、私が作成したgemに対してそれを行うためのコードがあります。

class BackupTask < Rails::Railtie
  rake_tasks do
    Dir[File.join(File.dirname(__FILE__),'tasks/*.rake')].each { |f| load f }
  end
end

したがって、基本的にはRails::Railtieから継承するクラスを作成し、そのクラス内に関連ファイルをロードするrake_tasksブロックを作成します。 .rake拡張機能を使用する場合は、requireの代わりにロードする必要があります。

Dirへの完全なパスを指定する必要があることがわかりました(したがって、File.join体操)。ファイルを明示的にリストしたいだけの場合は、gemのload 'tasks/foo.rake' dirがロードパスにあるため、/libと言っても問題ありません。

44
edebill

/taskslib/tasksのどちらも良い場所です。 Gem自体の作業または管理にタスクを使用する場合は/tasksを使用し、Gemユーザーがタスクをロードする場合はlib/tasksを使用します。

これは、Gemが必要なときにロードパスに自動的に追加されるlibフォルダー外のRubyファイルのロードに問題がある可能性があるためです。

また、*。rake拡張子を使用することをお勧めします。現在、ほぼすべてのIDEは.rake拡張子をRubyファイルに関連付け、最も高度なIDEはコンテンツを解析することさえできますrakeスクリプトとして。.rake拡張子は、ファイル内のコンテンツの概要を即座に提供できるため、開発者にとっても優れた選択肢です。

2番目の質問については、プラグインがGemとしてパッケージ化されている場合、Railsレーキタスクをロードする方法は現在ありません。レーキファイルをアプリケーションに含める必要があります(他のレーキファイルまたはメインのRakefileで)、またはプロジェクトのRakeタスクのクローンを作成します。

ベンダーフォルダーにプラグインをインストールすると、タスクとlib/tasksディレクトリの両方にあるすべての*.rakeファイルが、次の2行でRailsスコープに自動的に読み込まれます。

Dir["#{Rails_ROOT}/vendor/plugins/*/tasks/**/*.rake"].sort.each { |ext| load ext }
Dir["#{Rails_ROOT}/vendor/plugins/*/lib/tasks/**/*.rake"].sort.each { |ext| load ext }
31
Simone Carletti

Rails 3サポートの場合、lib/.rbファイルの最初の行は次のようになります。

Dir["tasks/**/*.rake"].each { |ext| load ext } if defined?(Rake)

Rails 2サポートの場合、gemインストーラーはRakefileを編集して以下を追加する必要があります。

Dir["#{Gem.searcher.find('<gemname>').full_gem_path}/lib/tasks/**/*.rake"].each { |ext| load ext }

requireステートメントの後。

ノート:

  • 必ず実際の宝石の名前に置き換えてください。
  • これは、すべてのRails表示のrakeタスクがlib/tasks /にあると想定しています

まだ簡単なものはまだありません。コメント?

12
Steven Soroka