我有三个rake任务,它们修改一个实例变量,然后调用任务:find
,这是Rakefile:
@tags = ['OPTIMIZE', 'TODO', 'FIXME']
task :optimize do
@tags = ['OPTIMIZE']
Rake::Task["find"].invoke
end
task :todo do
@tags = ['TODO']
Rake::Task["find"].invoke
end
task :fixme do
@tags = ['FIXME']
Rake::Task["find"].invoke
end
task :find do
# finds words depending on @tags
end
我想把耙子上的复制品去掉,使它更简洁。如何简化(或合并)此Rakefile中的:optimize、:todo、:fixme任务?
最佳答案
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"]
关于ruby - 从rake任务中删除重复项,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58478950/