2016-06-20 6 views
2

rakeタスクのためにプライベートヘルパーを作成することは可能ですか?それをやろうとしても、グローバルスコープで利用できるようになり、どのオブジェクトのメソッドとしても利用できます。例えば:私はあなたがこのようなあなたのrakeタスクを作成することができると思いグローバルスコープを汚染することなく、レーキタスクにモジュールを含めることは可能ですか?

## this is what I need 

module MyRakeHelpers 
    def helper_1 
    end 

    def helper_2 
    end 
end 

include RakeHelpers 

task :sometask do 
    helper_1 
    helper_2 
end 

## And this should not work: 

# global scope 
helper_1 

"a random object".helper_1 

class RandomClass 
    def foo 
    helper_1 
    end 
end 
+0

これをRakefileに貼り付け、 'rake sometask'を実行しました。helper_1が定義されていないので、爆発しました – kleaver

+0

明らかに、これは質問の一部であり、' MyRakeHelpers'をタスクIそれを聞いていないだろう:) –

+0

私は質問から、私は上記のコードのすべてが何とか働いていたと思った理由を知りたいと思ったことを理解していない – kleaver

答えて

3

トンを追加する必要がありますここでは私のために働いたものです:

module MyRakeHelpers 
    def helper 
    puts 'foo' 
    end 
end 

module MyRakeTasks 
    extend Rake::DSL 
    extend MyRakeHelpers 

    task :some_task do 
    helper 
    end 
end 

In shor tでは、Rake::DSLを含める(または拡張する)ことによって、Rake DSLを別の範囲で使用することができます。 sourceから:

DSLなど#task、#desc、#namespace、あなたはトップレベルのスコープ外でレーキを使用したい場合に使用を提供するモジュールです。コマンドラインから実行するRakefileの場合、このモジュールは自動的にインクルードされます。

taskは、フードの下でRake::Task#define_taskを使用します。これを使用して独自のDSLを書き込むこともできます。

チップHow To Build Custom Rake Tasks; The Right Wayのおかげで約define_taskです。

1

module MyRakeHelpers 
    def helper_1 
    end 

    def helper_2 
    end 
end 

task :sometask do 
    include RakeHelpers 
    helper_1 
    helper_2 
end 
+1

いいえ、それは実際にグローバルな名前空間を汚染するだろう、 'include'はタスクが呼び出されたときにのみ発生します。 ':sometask'ブロックに文字列' .helper_1'のようなものを追加することはできますが、うまく動作しますが、そうではありません。 'include'が呼び出されると、それらのヘルパーはすべてアプリケーションのどこでも利用できるようになります。 –

1

まずanwser: は、あなたが探しているものを、このですか?

module MyRakeHelpers 
    def self.helper_1 
    puts 'helper_1' 
    end 

    def self.helper_2 
    puts 'helper_2' 
    end 
end 

task :sometask do 
    MyRakeHelpers.helper_1 
    MyRakeHelpers.helper_2 
end 

第二の答え: 私は考えることができる唯一のことは、この

module MyRakeHelpers 
    def helper_1 
    puts 'helper_1' 
    end 

    def helper_2 
    puts 'helper_2' 
    end 
end 

task :sometask do |t| 
    t.extend MyRakeHelpers 
    t.helper_1 
end 

のようなものです。しかし、あなたはどこにでも

+0

このメソッドにアクセスするには、モジュールのインターフェイスを汚染する必要はありません。 rakeタスクのスコープに入れるだけであれば、モジュール上のメソッドを呼び出すインスタンスも同じことができますが、コードの誤用を少なくすることができます。 – Sean

+1

いいえ、それは明らかな解決策ですが、それは私が探しているものではなく、何百ものRakeタスクを持つプロジェクトがあり、同じ数のグローバルヘルパーがあり、モジュール名の前にプレフィックスを付けるのはちょっと面倒です。 –

関連する問題