Как сделать иерархическую сборку с граблями? - PullRequest
4 голосов
/ 18 сентября 2008

Я недавно начал использовать Rake для сборки некоторых из моих (не ruby) пакетов. Rake - это хорошо, но я обнаружил, что отсутствует способ иерархической сборки (агрегирование файлов Rake в подкаталогах). Так как это обычная функция в большинстве других инструментов сборки, мне интересно, есть ли у кого-нибудь, более знакомого с Rake, хорошее решение.

Ответы [ 4 ]

2 голосов
/ 18 сентября 2008

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

1 голос
/ 01 августа 2010

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

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

1 голос
/ 24 сентября 2008

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

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

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

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

0 голосов
/ 02 мая 2015

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

Dir.chdir(File.dirname(Rake.application.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

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

...