【问题标题】:Remove duplication from rake tasks从 rake 任务中删除重复项
【发布时间】:2020-02-17 02:37:33
【问题描述】:

我有三个 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 中删除重复项并使其更简洁。如何简化(或组合)这个 Rakefile 中的 :optimize、:todo、:fixme 任务?

【问题讨论】:

    标签: ruby task rake rakefile


    【解决方案1】:

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

    【讨论】:

    • 不错!我不知道我可以在 #each 块内创建任务。向:find 添加参数也很有帮助。
    猜你喜欢
    • 2019-12-22
    • 2017-06-10
    • 2011-06-14
    • 2010-10-09
    • 2017-10-04
    • 1970-01-01
    • 2019-08-04
    • 2015-09-30
    • 2018-08-21
    相关资源
    最近更新 更多