【问题标题】:Default task for namespace in RakeRake 中命名空间的默认任务
【发布时间】:2010-12-07 10:41:26
【问题描述】:

鉴于类似:

namespace :my_tasks do
  task :foo do
    do_something
  end

  task :bar do
    do_something_else
  end

  task :all => [:foo, :bar]
end

如何使:all 成为默认任务,以便运行rake my_tasks 将调用它(而不是必须调用rake my_tasks:all)?

【问题讨论】:

  • 您是否尝试过将默认值放入命名空间(task :default => :all)
  • 按照 Jim 的描述做,只有默认任务超出了命名空间,并且必须包含命名空间和任务名称。 (task :default => "my_tasks:all") 请参阅下面的答案以获取工作示例。

标签: ruby rake


【解决方案1】:

像这样将它放在命名空间之外:

namespace :my_tasks do
  task :foo do
    do_something
  end

  task :bar do
    do_something_else
  end

end

task :all => ["my_tasks:foo", "my_tasks:bar"]

另外...如果您的任务需要参数,那么:

namespace :my_tasks do
  task :foo, :arg1, :arg2 do |t, args|
    do_something
  end

  task :bar, :arg1, :arg2  do |t, args|
    do_something_else
  end

end

task :my_tasks, :arg1, :arg2 do |t, args|
  Rake::Task["my_tasks:foo"].invoke( args.arg1, args.arg2 )
  Rake::Task["my_tasks:bar"].invoke( args.arg1, args.arg2 )
end

请注意,在第二个示例中,您可以如何调用与命名空间同名的任务,即“my_tasks”

【讨论】:

  • 这只使它可以被称为rake all。在这种情况下,我有其他命名空间,所以我想要的是能够将任务my_tasks:all 称为rake my_tasks,而不是rake all
  • 那么就使用:task :my_tasks => ["my_tasks:foo", "my_tasks:bar"]
  • 对 simon 的评论投了赞成票,我忘了这就是我的做法。
【解决方案2】:

不是很直观,但您可以拥有一个名称空间和一个具有相同名称的任务,从而有效地为您提供所需的内容。比如

namespace :my_task do
  task :foo do
    do_foo
  end
  task :bar do
    do_bar
  end
end

task :my_task do
  Rake::Task['my_task:foo'].invoke
  Rake::Task['my_task:bar'].invoke
end

现在您可以运行类似的命令,

rake my_task:foo

rake my_task

【讨论】:

  • 这很好,涵盖了问题中所述的所有要求。
  • 我认为调用过于复杂,应该只是任务依赖:task :my_task => ['my_task:foo', 'my_task:bar']
【解决方案3】:

我将这个 Rakefile 用于黄瓜:

require 'cucumber'
require 'cucumber/rake/task'

namespace :features do
  Cucumber::Rake::Task.new(:fast) do |t|
    t.profile = 'fast'
  end

  Cucumber::Rake::Task.new(:slow) do |t|
    t.profile = 'slow'
  end

  task :ci => [:fast, :slow]
end

task :default => "features:ci"

如果我只输入:

rake

它运行默认任务,该任务同时运行快速和慢速测试。

我从Cheezy's blog 学到了this

【讨论】:

    【解决方案4】:

    如果命名空间中有很多任务,我建议你使用它。

    task :my_tasks do
      Rake.application.in_namespace(:my_tasks){|namespace| namespace.tasks.each(&:invoke)}
    end
    

    然后你可以通过以下方式运行命名空间中的所有任务:

    rake my_tasks
    

    有了这个,当您将新任务添加到该命名空间时,您无需担心更改您的 :all 任务。

    【讨论】:

    • 谢谢!! FFS,我一直在寻找这样的东西。手动必须使用任何更改或添加来更新“父”任务是残酷的,特别是如果任务由于它们的长度而保存在单独的文件中。这好多了。太棒了。
    • 对于它的价值,x 属于Rake::NameSpace 类。我更新了您的答案以反映这一点并更加明确。
    • 还更新了您的答案以使用简写 .each(&:invoke)
    【解决方案5】:

    我正在阅读 obvio171 的问题的方式是,他要求1)通过将命名空间作为任务来调用命名空间中的某个任务的系统方法。

    我经常遇到同样的需求。我喜欢在逻辑上将任务分组到命名空间中。通常,该分组类似于层次结构。因此,调用该组的愿望对我来说非常有意义。

    这是我的看法:

    module Rake::DSL
      def group(name, &block)
        ns = namespace name, &block
        default = ns[:default]
        task name => "#{name}:default" if default
        ns
      end
    end
    
    group :foo do
      task :foo1 do |t| puts t.name end
      task :foo2 do |t| puts t.name end
      task :default => [:foo1, :foo2]
    end
    
    task :default => :foo
    

    1)...或者问,几年前。尽管如此,这仍然是一个有趣的问题。

    【讨论】:

      【解决方案6】:

      在命名空间之外添加以下任务:

      desc "Run all my tasks"
      task :my_tasks => ["my_tasks:all"]
      

      请记住,您可以拥有与命名空间同名的任务。

      还有一个更大的例子,它展示了如何使用与命名空间同名的任务,即使是嵌套命名空间:

      namespace :job1 do
        task :do_something1 do
              puts "job1:do_something1"
          end
      
        task :do_something2 do
              puts "job1:do_something2"
          end
        task :all => [:do_something1, :do_something2]
      end
      
      desc "Job 1"
      task :job1 => ["job1:all"]
      
      # You do not need the "all"-task, but it might be handier to have one.
      namespace :job2 do
        task :do_something1 do
              puts "job2:do_something1"
          end
      
        task :do_something2 do
              puts "job2:do_something2"
          end
      end
      
      desc "Job 2"
      task :job2 => ["job2:do_something1", "job2:do_something2"]
      
      namespace :superjob do
          namespace :job1 do
              task :do_something1 do
                  puts "superjob:job1:do_something1"
              end
      
              task :do_something2 do
                  puts "superjob:job1:do_something2"
              end
          end
      
          desc "Job 1 in Superjob"
          task :job1 => ["job1:do_something1", "job1:do_something2"]
      
          namespace :job2 do
              task :do_something1 do
                  puts "superjob:job2:do_something1"
              end
      
              task :do_something2 do
                  puts "superjob:job2:do_something2"
              end
          end
      
          desc "Job 2 in Superjob"
          task :job2 => ["job2:do_something1", "job2:do_something2"]
      end
      
      desc "My Super Job"
      task :superjob => ["superjob:job1", "superjob:job2"]
      
      # Do them all just by calling "$ rake"
      task :default => [:job1, :job2, :superjob]
      

      复制下来试试看。

      【讨论】:

        【解决方案7】:

        基于Rocky的解决方案Default task for namespace in Rake

        这个dexter的回答Is there a way to know the current rake task?

        namespace :root do
          namespace :foo do
          end
        
          namespace :target do
            task :all do |task_all|
              Rake.application.in_namespace(task_all.scope.path) do |ns|
                ns.tasks.each { |task| task.invoke unless task.name == task_all.name } 
              end
            end
        
            task :one do
            end
        
            task :another do
            end
          end
        end
        

        【讨论】:

          【解决方案8】:

          结合 Szymon Lipiński 和 Shyam Habarakada 的答案,我认为这是最惯用和最简洁的答案:

          namespace :my_tasks do
            task :foo do
              do_something
            end
          
            task :bar do
              do_something_else
            end
          
          end
          
          task :my_tasks => ["my_tasks:foo", "my_tasks:bar"]
          

          允许您执行rake my_tasks,同时避免繁琐的子任务调用。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-12-20
            • 2013-05-12
            相关资源
            最近更新 更多