1

5つの異なる名前空間を持つRakefileがあり、それぞれに同じ6つのメソッドシグネチャがあります。各署名の本文はまったく同じです。これらは、メソッドが使用するインスタンス変数の値のみが異なります。

具体的な例:

namespace :db do
  namespace :foo do
    @user = "foo"
    task :create do
      function_call_to_do_stuff @user
    end
  end

  namespace :bar do
    @user = "bar"
    task :create do
      function_call_to_do_stuff @user
    end
  end
end

理想的には、次のようなことができるようにしたいと思います。

module Migratable
  task :create do
    function_call_to_do_stuff @user
  end
end

namespace :db do
  namespace :foo do
    include Migratable
    @user = "foo"
  end

  namespace :bar do
    include Migratable
    @user = "bar"
  end
end

上に示したようにすると、ミックスイン内のタスクは、適切な名前空間のタスクとして、またはそのことについてはまったくタスクとして登録されません。これを達成する方法はありますか?

4

1 に答える 1

1

Rake はただの Ruby ですので、インクルードとエクステンドでモジュールを自由に使用できます。

そうは言っても、目的を達成するためのより簡単な方法があります。それは、モジュールを単純な Ruby にすることです。

例:

# migratable.rb
module Migratable
  def create x
    puts x
  end
end


# rakefile.rb
require_relative 'migratable'
include Migratable

namespace :db do

  task :foo do
    @user = "foo"
    create(@user)
  end

  task :bar do
    @user = "bar"
    create(@user)
  end

end

Rake では、ネームスペース内ではなく、タスク内で上書きされる可能性があるインスタンス変数を設定する必要があります。これは、タスクの実行前に名前空間がすべて解析されるためです。

于 2013-02-21T04:48:42.747 に答える