2011-07-03 4 views
1

複数のディレクトリに対して、以下のRakeタスクを使いたいと思います。また、各ディレクトリにはわずかに異なる定数が定義されている必要があります。どうやってこれを処理してドライを続けることができますか?フレキシブルなレーキタスク

答えて

1

あなたの助けを借りて、私はついにそれを考え出しました。ここまで私のために働いているのは、これまでのところです:

namespace :assets do 
    task :set, [:ext, :objdir] do |t, args| 
    @ext = args.ext 
    @objdir = args.objdir 
    @bundle = "#{@objdir}/bundle.#{@ext}" 
    @src = FileList["#{@objdir}/*.#{@ext}"].select {|file| !file.match(/\.min\.#{@ext}|#{Regexp.escape(@bundle)}/)} 
    @min = @src.collect {|fn| File.join(@objdir, File.basename(fn).ext("min.#{@ext}"))} 

    Rake::Task.define_task 'assets:build' => @bundle 

    Rake::FileTask.define_task @bundle => @min do 
     sh "cat #{@min} > #{@bundle}" 
    end 

    Rake::Task.create_rule ".min.#{@ext}" => lambda{ |objfile| find_source(objfile) } do |t| 
     if @ext == 'js' 
     if @mine.include?(File.basename(t.source)) 
      sh "closure --js #{t.source} --js_output_file #{t.name}" 
     else 
      sh "closure --warning_level QUIET --third_party --js #{t.source} --js_output_file #{t.name}" 
     end 
     elsif @ext == 'css' 
     sh "yuicompressor #{t.source} -o #{t.name}" 
     end 
    end 
    end 

    desc "Remove minified files" 
    task :clean do 
    rm_f @min 
    end  

    desc "Remove bundle" 
    task :clobber do 
    rm_f @bundle 
    end 

    def find_source(objfile) 
    base = File.basename(objfile, ".min.#{@ext}") 
    @src.find {|s| File.basename(s, ".#{@ext}") == base} 
    end 
end 
3

まず、変数を変数に置き換える必要があります。 次の問題は、変数を設定することです。 タスクは変数を取得できます。

例:

namespace :assets do |x1,x2| 
    task :doit, :ext, :objdir do |tsk, args| 
    puts tsk 
    p args 
    end 
end 

あなたはでそれを呼び出すことができます。

rake assets:doit[js,objdir] 

結果:

assets:doit called with {:ext=>"js", :objdir=>"objdir"} 

あなたのタスクごとに変数を設定しないようにしたい場合は、 「設定」タスクを追加することができます:

namespace :assets2 do |x1,x2| 
    task :set, :ext, :objdir do |tsk, args| 
    @args = args 
    puts "#{tsk} set: #{@args.inspect}" 
    end 
    task :doit do |tsk| 
    puts "#{tsk} called with #{@args.inspect}" 
    end 
end 

コール: すくいassets2:設定[JS、オブジェクトディレクトリ] assets2:

結果ドイト:代わりに、すべてのパラメータを設定するので

assets2:set set: {:ext=>"js", :objdir=>"objdir"} 
assets2:doit called with {:ext=>"js", :objdir=>"objdir"} 

を、あなたは設定ファイルを定義することもできます。

欠点が1つあります。次のタスクは機能しません。

rake assets:doit[js,objdir] assets:doit[c,objdir2] 

アセット:doitは一度呼び出されます。 2番目の呼び出しは無視され、タスクはすでに実行されています。

編集:異なるパラメータのためのチェック(おそらくあなたは、タスクをリセットすることができ、このための一つの解決策は):ありません、私は「reset'-方法を発見し、テストした:あなたはtsk.reenable

namespace :assets do |x1,x2| 
    task :doit, :ext, :objdir do |tsk, args| 
    puts "#{tsk} called with #{args.inspect}" 
    tsk.reenable 
    end 
end 
を追加する必要があります

別の問題:パラメータにスペースが含まれている場合。あなたは困っているかもしれません。ルールの一般的な生成のための

============== コード:(コメントを参照してください)

namespace :assets3 do |x1,x2| 
    task :set, :ext, :objdir do |tsk, args| 
    @args = args 
    @src = FileList["*.rb"] 

    puts "#{tsk} set: #{@args.inspect}" 

    #Define rule, when extension is set. 
    rule ".min.#{@args[:ext]}" => lambda{ |objfile| find_source(objfile) } do |t| 
     puts "#{t} called with #{@args.inspect}" 
    end 

    end 

    task :doit do |tsk| 
    puts "#{tsk} called with #{@args.inspect}" 
    end 

    def find_source(objfile) 
    base = File.basename(objfile, ".min.#{@args[:ext]}") 
    #If nothing is found, rake will abort with 'can't convert nil into String (TypeError)' 
    #If I return '' in this case, I get 'Don't know how to build task 'test.min.js' (RuntimeError)' 
    @src.find {|s| File.basename(s, ".#{@args[:ext]}") == base} || '' 
    end 

end 
+0

ありがとうございました。私はこれを試しましたが、動作していないようです。 'file'タスクはこのように正しく定義されていないようで、' build'タスクは定義された依存関係を取得しません。 –

+0

私はこのエラーが発生しています: '循環依存が検出されました:TOP => assets:build => =>' –

+0

変数はタスクの定義内でのみ使用可能です。 –

関連する問題