複数のディレクトリに対して、以下のRakeタスクを使いたいと思います。また、各ディレクトリにはわずかに異なる定数が定義されている必要があります。どうやってこれを処理してドライを続けることができますか?フレキシブルなレーキタスク
1
A
答えて
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
関連する問題
- 1. フレキシブルなPHP/MySQLページネーミング
- 2. フレキシブルなDrupal HTMLフィルタ
- 3. UrllibとBeautifulSoupフレキシブルなurlopen()オプション
- 4. フレキシブルなdivの高さメインコンテンツ
- 5. フレキシブルCSSボタン画像なし
- 6. ブラウザのフレキシブルなHTMLマップ
- 7. フレキシブルなappengineのCronジョブ
- 8. セキュアでフレキシブルなドメイン間セッション
- 9. フレキシブルなUILabelの作成
- 10. フレキシブルなページの配置メニュー
- 11. マルチスレッドのレーキタスク
- 12. レーキタスクをDaemoninsing
- 13. レーキタスクのインクリメントパラメータ
- 14. ポルターガイストのHerokuレーキタスク
- 15. フレキシブルWebクローラー
- 16. フレキシブルAppEngineのターゲットマイクロインスタンス
- 17. Xenforo + CloudflareフレキシブルSSL
- 18. 基本的なレーキタスクを作成する
- 19. レーキタスクとレーキタスクの依存関係をオーバーライドしますか?
- 20. 別のレーキタスクで別のレーキタスクを並列に実行する
- 21. フレキシブルな電子商取引とソーシャルネットワーキングソリューション
- 22. jQuery append breakableフレキシブルな幅のCSSレイアウト
- 23. Outlook 07 2列のフレキシブルなレイアウト
- 24. フレキシブルなCSSボタン(可変幅とマークアップ)
- 25. フレキシブルなレポートソリューションをお探しですか
- 26. フレキシブルな正規表現のURL、Django
- 27. フレキシブルなサイズ変更DataGridColumns(動的数値)
- 28. jQueryフレキシブルなフィールドセットの非表示/表示
- 29. フレキシブルなボタンの作成(チェーン+スプレッド)
- 30. フレキシブルHTMLスポーツブラケットのコード
ありがとうございました。私はこれを試しましたが、動作していないようです。 'file'タスクはこのように正しく定義されていないようで、' build'タスクは定義された依存関係を取得しません。 –
私はこのエラーが発生しています: '循環依存が検出されました:TOP => assets:build => =>' –
変数はタスクの定義内でのみ使用可能です。 –