Удалить дубликаты из рейка задач - PullRequest
1 голос
/ 21 октября 2019

У меня есть три рейк-задачи, которые модифицируют переменную экземпляра и затем вызывают задачу :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 в этом Rakefile?

1 Ответ

3 голосов
/ 21 октября 2019

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"]
...