Избегайте дублирования при настройке свойств задачи в задачах Rake.

У меня есть куча задач по построению граблей.

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

task :buildThisModule => "bin/modules/thisModule.swf"

mxmlc "bin/modules/thisModule.swf" do |t|
    t.input = "src/project/modules/ThisModule.as"
    t.prop1 = value1
    t.prop2 = value2 ... (And many more property=value sets that are the same in each task)
end


task :buildThatModule => "bin/modules/thatModule.swf"

mxmlc "bin/modules/thatModule.swf" do |t|
    t.input = "src/project/modules/ThatModule.as"
    t.prop1 = value1
    t.prop2 = value2 ... (And many more property=value sets that are the same in each task)
end

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

Есть ли аналогия с граблями для этого? Каким-то образом у меня может быть одна функция, в которой общие свойства устанавливаются для любой задачи? Что-то эквивалентное:

task :buildThisModule => "bin/modules/thisModule.swf"

mxmlc "bin/modules/thisModule.swf" do |t|
    addCommonTaskParameters(t)
    t.input = "src/project/modules/ThisModule.as"
end


task :buildThatModule => "bin/modules/thatModule.swf"

mxmlc "bin/modules/thatModule.swf" do |t|
    addCommonTaskParameters(t)
    t.input = "src/project/modules/ThatModule.as"
end

Спасибо.

======

В ответ на СР:

Спасибо, Стивен,

Я явно что-то упускаю - у меня есть:

desc 'Compile run the test harness'
unit :test do |t|
  populate_test_task(t)
end

def populate_test_task(t)
  t.source_path << "support"
  t.prepended_args       = '+configname=air -define+=CONFIG::LocalDebug,true'
end

Я попытался определить функцию сразу после задачи (в этом файле нет пространства имен) и прямо в конце файла после последней задачи, и я получаю "неопределенный метод `populate_test_task' для main:Object" - мне кажется, что он не находит функцию.

Что мне не хватает?


person Stray    schedule 31.05.2010    source источник


Ответы (3)


Вы можете вызывать обычные методы, определенные ниже в файле rake, например.

namespace :build do

    desc 'builds ABC module'
    task :abc do
        build_mod('abc')
    end

    desc 'builds DEF module'
    taks :def do
        build_mod('def')
    end
end

def build_mod(module_name)
    # stuff to build the module
end

затем вызовите его с помощью rake build:abc и rake build:def

sr

person stephenr    schedule 31.05.2010
comment
Спасибо, Стивен, я явно что-то упускаю - у меня есть: desc 'Скомпилируйте и запустите тестовую обвязку' unit :test do |t| populate_test_task(t) end def populate_test_task(t) t.source_path ‹‹ support t.prepended_args = '+configname=air -define+=CONFIG::LocalDebug,true' end Я пытался определить функцию сразу после задачи (нет пространство имен: в этом файле) и прямо в конце файла после последней задачи, и я получаю неопределенный метод `populate_test_task' для main:Object, который, как мне кажется, не находит функцию. Что мне не хватает? - person Stray; 31.05.2010
comment
Уг. Форматирование комментариев так раздражает. Вместо этого добавлено внизу моего вопроса. - person Stray; 31.05.2010
comment
Привет Бродяга, я не знаком с устройством :test do |t| строчка - это откуда? - person stephenr; 31.05.2010

Извините за путаницу здесь....

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

Именно по этой причине ваша функция configure должна быть определена перед задачами, которые ее используют.

person Luke Bayes    schedule 31.05.2010

Потрясающая командная работа!

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

Нравится:

def populate_test_task(t)
  t.source_path << "support"
  t.prepended_args       = '+configname=air -define+=CONFIG::LocalDebug,true'
end

desc 'Compile run the test harness'
unit :test do |t|
  populate_test_task(t)
end  
person Stray    schedule 31.05.2010