Сначала вы должны заменить константы на переменные.
Следующая проблема - установить переменные.
Задача может получить переменные.
Пример:
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"}
Если вы хотите избежать установки переменных для каждой вашей задачи, вы можете добавить задачу 'set':
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
Вызов:
rake assets2: установить [js, objdir] assets2: doit
Результат:
assets2:set set: {:ext=>"js", :objdir=>"objdir"}
assets2:doit called with {:ext=>"js", :objdir=>"objdir"}
Вместо настройки всех параметров вы можете определить файл конфигурации.
Есть один недостаток. Следующая задача не будет работать:
rake assets:doit[js,objdir] assets:doit[c,objdir2]
активы: doit будет вызван один раз второй вызов игнорируется, задача уже выполнена. нет проверки для других параметров (одно из решений: возможно, вы могли бы сбросить задачу)
Редактировать: я нашел и протестировал метод сброса: вам просто нужно добавить 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