1)ジェム内にレーキタスクを行うのに最適な場所はありますか?私はそれらを/tasks
、/lib/tasks
、および*.rb
および*.rake
-「正しい」場合、どれが正しいかわからない
2)Gemが環境で構成された後、アプリでそれらを使用できるようにするにはどうすればよいですか?
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
と言っても問題ありません。
/tasks
とlib/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 }
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ステートメントの後。
ノート:
まだ簡単なものはまだありません。コメント?