Rails で特定のディレクトリ配下にある Rakeタスク ファイル内のタスクを全て実行する

状況

以下の3つの Rakeタスクファイル があるとします。

  • lib/tasks/foo/a.rake
  • lib/tasks/foo/b.rake
  • lib/tasks/foo/c.rake

それぞれのファイル内には以下の名前のタスクが定義されているものとします。

  • a
  • b
  • c

この 3つ のタスクを抽象的なコード*1で実行します。

タスクファイルの中身の具体例

上記の例の lib/tasks/foo/a.rake の中身の例は以下のとおりです。

namespace :foodo
    desc 'Task a'
    task a: :environment do
      # ここにタスクの中身が記述されている
    end
  end
end

結論

Dir.glob('lib/tasks/foo/*.rake').each do |file|
  task_name = File.basename(file, '.rake')
  Rake::Task["foo:#{task_name}"].invoke
end

注意点

  • ファイル名 = タスク名 という前提条件を守っている必要があります
    • ファイル名 = タスク名 という条件は絶対的なものではなく、「抽象」の記述が守られるような命名規則が定立されているならばそれで OK です*2

*1:a や b や c という「具体」が現れないコード

*2:新規ファイルの作成時にはそのルールを守る必要があります

Powered by はてなブログ