Engine に Rake タスクを追加する

# lib/tasks/my_engine_tasks.rake
desc "hello task in my engine"
task hello: :environment do
  puts "hello"
end

エンジンのディレクトリからは rails app:hello、エンジンを取り込んだアプリケーションのディレクトリからは rails hello でタスクを実行できる。

$ cd my_engine
$ rails -T
...
rails app:hello  # hello task in my engine
...
$ rails app:hello
hello
$ cd test/dummy
$ rails -T
...
rails hello  # hello task in my engine
...
$ rails hello
hello

参考:

How do I create a rake task for a Rails engine which is not exposed to the host application? – Stack Overflow

アプリケーションから見えるタスクに名前空間を付ける

# lib/tasks/my_engine_tasks.rake

def in_engine?
  Rails.root.to_s.start_with?(MyEngine::Engine.root.to_s)
end

def engine_namespace(&block)
  if in_engine? then
    yield
  else
    namespace :my_engine, &block
  end
end

engine_namespace do
  desc "hello task in my engine"
  task hello: :environment do
    puts "hello"
  end
end

エンジンのディレクトリからは rails app:hello、test/dummy ディレクトリからは rails hello、エンジンを取り込んだアプリケーションのディレクトリからは rails my_engine:hello でタスクを実行できる。

$ cd my_app
$ rails -T
...
rails my_engine:hello  # hello task in my engine
...
$ rails my_engine:hello
hello

$ cd my_engine
$ rails -T
...
rails app:hello  # hello task in my engine
...
$ rails app:hello
hello
$ cd test/dummy
$ rails -T
...
rails hello  # hello task in my engine
...
$ rails hello
hello
タグ:

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です