Как сделать рекурсивные грабли?- или подходящие альтернативы - PullRequest
6 голосов
/ 12 июня 2010

Я хочу, чтобы мои проекты верхнего уровня Rakefile строили вещи, используя rakefiles глубже в дереве; то есть rakefile верхнего уровня говорит о том, как построить проект (общая картина), а нижний уровень - о создании определенного модуля (локальная картинка).

Существует, конечно, общий набор конфигурации для мельчайших деталей выполнения этого, когда он может быть разделен между задачами: так что в основном речь идет о хранении описаний того, что нужно построить, как можно ближе к строящимся источникам. Например. /Source/Module/code.foo и cie должны быть собраны с использованием инструкций в / Source / Module / Rakefile; и / Rakefile понимает зависимости между модулями.

Мне все равно, использует ли он несколько процессов rake (ala recursive make) или просто создает отдельные среды сборки. В любом случае он должен быть достаточно самодостаточным для обработки в очереди: чтобы независимые модули могли создаваться одновременно.

Проблема в том, как, черт возьми, ты делаешь что-то подобное с Рейком !? Я не смог найти ничего значимого ни в Интернете, ни в документации. Я попытался создать новый объект Rake :: Application и настроить его, но, какие бы методы я ни пытался вызывать, генерируются только исключения или ошибки «Не знаю, как создать задачу»: по умолчанию ». (Да, все rakefiles имеют: default). Очевидно, что можно просто выполнить 'rake' в подкаталоге для задачи: modulename, но это нарушит параметры, заданные для верхнего уровня; например подумайте о $ (MAKE) и $ (MAKEFLAGS).

Кто-нибудь знает, как правильно делать что-то вроде recursive рейка?

Ответы [ 4 ]

3 голосов
/ 14 июня 2010

вы можете require создавать файлы из других файлов и запускать задачи из необходимого файла.

поместите это в rakefile.rb:

require 'foo/rakefile.rb'

task :default => [:bar]

поместите это в foo / rakefile.rb:

task :bar do
  puts "baz"
end

запустите rakefile корневого уровня, и он выведет «baz» на экран. вы должны быть в состоянии организовать ваши грабли файлы и общий код, как вы хотите, используя эту идею

2 голосов
/ 23 ноября 2013

Как упоминалось в моем предыдущем посте, здесь приведен фрагмент кода, который поддерживает почти как рекурсивное поведение рейка, включая передачу параметров, пробный запуск, трассировку, задачу верхнего уровня.

грабли:

#!/usr/bin/env ruby

begin
  require 'rubygems'
  gem 'rake'
rescue LoadError
end

$sub_directories = []
$top_level_task_provided__skip_subdir = 0
module Rake
   REDUCE_COMPAT = true if ARGV.include?("--reduce-compat")
   RAKE_OPTS = ARGV.clone.join(" ") 
   module DSL
     def subdirs dirs
        puts "DIRS: #{dirs}"
        $sub_directories = dirs
     end
   end
end

require 'rake'

Rake.application.standard_exception_handling do
   Rake.application.init
   $top_level_task_provided__skip_subdir = 1 if Rake.application.top_level_tasks.size >= 1 and Rake.application.top_level_tasks[0] != "default"
   Rake.application.load_rakefile
   if Rake.application.tasks.size == 0 and $sub_directories.size != 0 then
      desc "Default task when only subdirs is present in a rakefile"
      task :default do
         puts "Default subdir task"
      end
   end
   Rake.application.top_level
end

if $top_level_task_provided__skip_subdir == 0 then
    $sub_directories.each do |d|
        unless rake_system("cd #{d} && pwd && ruby #{File.expand_path $0} #{Rake::RAKE_OPTS}") then
            exit(1)
        end
    end
end
0 голосов
/ 23 ноября 2013

У меня есть аналогичное требование и я создал следующую функцию

rakeutils.rb:

def subdirs dirs
    dirs.each do |d|
      task d do |t|
        sh("cd #{t.name} && pwd && rake")
      end
    end
    task :default => dirs
end

и в Rakefiles, где бы я ни захотел использовать эту функцию, я просто включаю ее... например,

Rakefile:

require 'rakeutils'

task :test1 do
  puts "Hi"
end

task :default => :test1
subdirs ["ab", "cd"]

относительно опций, я не нашел ни одного автоматического способа их передачи ... кроме редактирования "rake" и захвата опций до того, как они будут использованыпо опции обработки граблей

0 голосов
/ 13 августа 2010

Если я правильно понял, ваша проблема в том, что вам нужно вызвать задачу Rake в другой задаче Rake из другого файла RakeFile.

Вы можете создавать нужные вам задачи в / Source / Module / Rakefile так, как вам нужно, создать другой Rakefile в / Rakefile и запускать задачи таким образом.

desc 'Description'
task :foo do
    %x[rake -f /Source/Module/RakeFile foo:bar]
end

-f позволяет вам определить, где находится Rakefile

Вы также можете указать, где находится ваша папка rakelib, с помощью -R.

rake -f /path/to/Rakefile -R /path/to/rakelib foo:bar

Надеюсь, это поможет вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...