Rake-задачи могут принимать аргументы, поэтому вместо использования переменной экземпляра вы можете передать теги:
TAGS = ['OPTIMIZE', 'TODO', 'FIXME']
task :find, [:tags] do |task, args|
# command lines can't pass an array, afaik; so if we pass the
# tags in, we'll need them as a space separated list
tags = if args[:tags]
args[:tags].split(' ')
else
TAGS
end
puts "finding all tags marked: #{tags.inspect}"
end
и затем в командной строке:
% rake find[TODO OPTIMIZE] # may need escaped: rake find\[TODO\ OPTIMIZE\]
finding all tags marked: ["TODO", "OPTIMIZE"]
% rake find
finding all tags marked: ["OPTIMIZE", "TODO", "FIXME"]
изатем, если вам все еще нужны именованные задачи в качестве псевдонимов, передавая определенные аргументы, вы можете передать их через invoke
:
TAGS.each do |tag|
task tag.downcase.to_sym do
Rake::Task["find"].invoke(tag)
end
end
и вызвать их:
% rake todo
finding all tags marked: ["TODO"]
% rake fixme
finding all tags marked: ["FIXME"]
% rake optimize
finding all tags marked: ["OPTIMIZE"]