代码之家  ›  专栏  ›  技术社区  ›  agentofuser

rake中命名空间的默认任务

  •  82
  • agentofuser  · 技术社区  · 16 年前

    给出如下信息:

    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 )?

    7 回复  |  直到 9 年前
        1
  •  85
  •   Daithí    13 年前

    将其放在命名空间之外,如下所示:

    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
    

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

        2
  •  49
  •   Gabriel Lett Simone Carletti    9 年前

    不太直观,但是您可以有一个名称空间和一个同名的任务,这实际上为您提供了所需的东西。例如

    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
    
        3
  •  8
  •   Rocky    13 年前

    如果名称空间中有很多任务,我建议您使用这个方法。

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

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

    rake my_tasks
    

    有了这个,当您向名称空间中添加新任务时,您不必担心更改:所有任务。

        4
  •  3
  •   Randy Eppinger Beffa    13 年前

    我用这个油炸黄瓜:

    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
    

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

    我学会了 this Cheezy's blog .

        5
  •  2
  •   zor-el    10 年前

    我读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
  •  1
  •   tvw    10 年前

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

    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
  •  0
  •   Community Mohan Dere    9 年前

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

    德克斯特的回答 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
    
    推荐文章