2008-09-18 4 views
4

Недавно я начал использовать Rake для создания некоторых из моих (нерублевых) пакетов. Рейк хороший, но то, что я нашел пропавшим, - это способ сделать иерархические сборки (агрегированные Rakefiles в подкаталогах). Поскольку это обычная функция в большинстве других инструментов сборки, мне интересно, есть ли у кого-то, более знакомого с Rake, хорошее решение.Как сделать иерархическую сборку с помощью рейка?

ответ

2

Я бы порекомендовал Buildr для выполнения задач, не связанных с Ruby. Он основан на Rake (сидит поверх него, позволяя использовать все возможности Rake), но лучше подходит семантике скомпилированных языков. Он также поддерживает иерархические сборки.

1

Я тоже не мог понять, как это сделать. Я закончил:

SUBDIR = "subdir" 
task :subtask => SRC_FILES do |t| 
    chdir(SUBDIR) do 
     system("rake") 
    end 
end 

task :subtaskclean do |t| 
    chdir(SUBDIR) do 
     system("rake clean") 
    end 
end 

task :subtaskclean do |t| 
    chdir(SUBDIR) do 
     system("rake clobber") 
    end 
end 

task :default => [:maintask, :subtask] 
task :clean => :subtaskclean 
task :clobber => :subtaskclobber 

Kinda сосет. На самом деле, действительно отстой. Я мытая документы и не смог найти эквивалент <antcall>

Я уверен, что так как это все Руби и я едва знаю Руби есть некоторые супер очевидный способ require ИНГ его или что-то.

+0

Требование рубина не работает, так как оно не меняет рабочий каталог. Я не смог найти никаких примитивов ruby, которые поддерживают это рекурсивное поведение. – 2015-05-01 22:37:49

1

Buildr использует понятие областей в сочетании с названием проектов.

Rake.application.current_scope должен быть точкой входа, чтобы узнать, как с ними работать. Надеюсь, это поможет.

0

Исправление я использовал, чтобы обойти это:

Dir.chdir(File.dirname(Rake.application.rakefile)) 

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

/rakefile:

task :default do 
    sh "rake -f component/rakefile" 
end 

/Компонент/rakefile

Dir.chdir(File.dirname(Rake.application.rakefile)) 

task :binary => OBJECTS do 
    sh "gcC#{SOURCES} -Iinclude -o #{TARGET}" 
end 

Как я новичок грабли я не уверен, что это чистейшая метод его решения, но именно так я в конечном итоге получил его на работу.

Смежные вопросы