Задача по умолчанию для пространства имен в Rake

88

Учитывая что-то вроде:

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

Helder S Ribeiro
источник
пробовали ли вы поместить значение по умолчанию в пространство имен (task: default =>: all)
Джим Девиль,
Делайте то, что описывает Джим, только задача по умолчанию выходит за пределы пространства имен и должна включать пространство имен и имя задачи. (task: default => "my_tasks: all") Рабочий пример см. в моем ответе ниже.
Рэнди Эппингер

Ответы:

87

Поместите его вне пространства имен следующим образом:

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».

Шимон Липиньски
источник
4
Это только делает его доступным для вызова rake all. В этом случае у меня есть другие пространства имен, поэтому я хочу иметь возможность называть задачу my_tasks:allкак rake my_tasks, а не как rake all.
Helder S Ribeiro
53
так что просто используйте: task: my_tasks => ["my_tasks: foo", "my_tasks: bar"]
Шимон Липински
2
Up проголосовал за комментарий Саймона, я забыл, что я так делаю.
Джим Девиль,
52

Не очень интуитивно понятно, но у вас может быть пространство имен и задача с одинаковыми именами, и это дает вам то, что вы хотите. Например

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
это здорово и покрывает все требования, указанные в вопросе.
Ивар
1
Я думаю, что вызов слишком сложен, и это должны быть просто зависимости задач:task :my_task => ['my_task:foo', 'my_task:bar']
Александр Пресбер
8

Я предлагаю вам использовать это, если у вас много задач в пространстве имен.

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

А затем вы можете запускать все задачи в пространстве имен:

rake my_tasks

При этом вам не нужно беспокоиться об изменении вашей задачи: all при добавлении новых задач в это пространство имен.

Рокки
источник
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 .

Рэнди Эппингер
источник
3

Я читаю вопрос 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) ... или спрашивал много лет назад. Тем не менее, все еще интересный вопрос.

зор-эль
источник
1

Добавьте следующую задачу вне пространства имен:

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]

Просто скопируйте его и попробуйте.

тв
источник
0

На основе решения Rocky Задача по умолчанию для пространства имен в Rake

И этот ответ Декстера. Есть ли способ узнать текущую задачу по рейку?

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
x'ES
источник
0

Объединив ответы Шимона Липинского и Шьяма Хабаракады, вот что я считаю наиболее идиоматическим и логичным:

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, избегая громоздких вызовов подзадач.

Александр Пресбер
источник