我有三个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/

10-13 02:08
查看更多