Как запустить Rake-задачи из Rake-задач? - PullRequest
393 голосов
/ 23 февраля 2009

У меня есть Rakefile, который компилирует проект двумя способами, в соответствии с глобальной переменной $build_type, которая может быть :debug или :release (результаты помещаются в отдельные каталоги):

task :build => [:some_other_tasks] do
end

Я хочу создать задачу, которая поочередно компилирует проект с обеими конфигурациями, примерно так:

task :build_all do
  [ :debug, :release ].each do |t|
    $build_type = t
    # call task :build with all the tasks it depends on (?)
  end
end

Есть ли способ вызвать задачу, как если бы это был метод? Или как мне добиться чего-то подобного?

Ответы [ 7 ]

617 голосов
/ 18 августа 2009

Если вам нужно, чтобы задача работала как метод, как насчет использования фактического метода?

task :build => [:some_other_tasks] do
  build
end

task :build_all do
  [:debug, :release].each { |t| build t }
end

def build(type = :debug)
  # ...
end

Если вы предпочитаете придерживаться идиом rake, вот ваши возможности, составленные из предыдущих ответов:

  • Это всегда выполняет задачу, но не выполняет ее зависимости:

    Rake::Task["build"].execute
    
  • Этот выполняет зависимости, но выполняет только, если это еще не было вызвано:

    Rake::Task["build"].invoke
    
  • Это сначала сбрасывает состояние задачи уже_проверено, позволяя задаче затем выполнить снова, зависимости и все:

    Rake::Task["build"].reenable
    Rake::Task["build"].invoke
    

    (Обратите внимание, что уже вызванные зависимости не выполняются повторно)

117 голосов
/ 23 февраля 2009

например:

Rake::Task["db:migrate"].invoke
55 голосов
/ 29 апреля 2009
task :build_all do
  [ :debug, :release ].each do |t|
    $build_type = t
    Rake::Task["build"].reenable
    Rake::Task["build"].invoke
  end
end

Это должно разобраться с тобой, просто нужно то же самое самому.

11 голосов
/ 23 февраля 2009
task :build_all do
  [ :debug, :release ].each do |t|
    $build_type = t
    Rake::Task["build"].execute
  end
end
6 голосов
/ 09 сентября 2018
task :invoke_another_task do
  # some code
  Rake::Task["another:task"].invoke
end
3 голосов
/ 07 февраля 2013

Если вы хотите, чтобы каждая задача выполнялась независимо от сбоев, вы можете сделать что-то вроде:

task :build_all do
  [:debug, :release].each do |t| 
    ts = 0
    begin  
      Rake::Task["build"].invoke(t)
    rescue
      ts = 1
      next
    ensure
      Rake::Task["build"].reenable # If you need to reenable
    end
    return ts # Return exit code 1 if any failed, 0 if all success
  end
end
0 голосов
/ 12 сентября 2014

Я бы посоветовал не создавать общие задачи отладки и выпуска, если проект действительно является чем-то, что компилируется и в результате получается файлы. Вы должны пойти с файловыми задачами, что вполне выполнимо в вашем примере, поскольку вы утверждаете, что ваш вывод идет в разные каталоги. Скажем, ваш проект просто компилирует файл test.c в out / debug / test.out и out / release / test.out с помощью gcc, вы можете настроить свой проект следующим образом:

WAYS = ['debug', 'release']
FLAGS = {}
FLAGS['debug'] = '-g'
FLAGS['release'] = '-O'
def out_dir(way)
  File.join('out', way)
end
def out_file(way)
  File.join(out_dir(way), 'test.out')
end
WAYS.each do |way|
  desc "create output directory for #{way}"
  directory out_dir(way)

  desc "build in the #{way}-way"
  file out_file(way) => [out_dir(way), 'test.c'] do |t|
    sh "gcc #{FLAGS[way]} -c test.c -o #{t.name}"
  end
end
desc 'build all ways'
task :all => WAYS.map{|way|out_file(way)}

task :default => [:all]

Эту настройку можно использовать как:

rake all # (builds debug and release)
rake debug # (builds only debug)
rake release # (builds only release)

Это немного больше, чем просили, но показывает мои очки:

  1. при необходимости создаются выходные каталоги.
  2. файлы перекомпилируются только при необходимости (этот пример подходит только для простейших файлов test.c).
  3. у вас есть все задачи под рукой, если вы хотите запустить сборку релиза или сборку отладки.
  4. этот пример включает способ определения небольших различий между отладочной и выпускной сборками.
  5. нет необходимости повторно включать задачу сборки, которая параметризована глобальной переменной, потому что теперь разные сборки имеют разные задачи. повторное использование кода задачи сборки выполняется путем повторного использования кода для определения задач сборки. посмотрите, как цикл не выполняет одну и ту же задачу дважды, а вместо этого создает задачи, которые впоследствии могут быть запущены (либо с помощью всей задачи, либо путем выбора одной из них в командной строке rake).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...