2015-12-08 5 views
3

Я пришел к проекту, который имеет сценарий Gradle, который динамически создает задачи на основе списка. Это происходит потому, что когда люди разворачивают репозиторий, они могут просто редактировать список. Она сводится к тому, что-то вроде этого:Gradle - динамическое создание нескольких публикаций

def files = ['file1', 'file2', 'file3'] 

files.each { f -> 
    task (f, type: Exec) { 
     executable 'touch' 
     args file 
    } 
} 

То, что я хотел бы сделать это, чтобы иметь возможность публиковать выходы задач. Я в идеале хочу сделать это, поскольку несколько публикаций. Я дал ему удар с приведенным ниже фрагментом кода, но Gradle, похоже, действительно ненавидит тот факт, что я использую java.lang.String.call() как имя класса!

publishing { 
    publications { 
     files.each { f -> 
      f (IvyPublication) { 
       module f 
       artifact (file(f)) 
      } 
     } 
    } 
} 

Является ли то, что я пытаюсь сделать возможным, или я должен полностью изменить курс?

[изменить] I думаю Я могу сделать это с IvyPublication.loadClass(f), но борясь с деталями. Любая помощь очень ценится

+1

Это не проверено, но стоит попробовать 'it.f (IvyPublication) {'. 'It' будет ссылаться на вызывающий класс и с file1/file2/etc. методов не будет, метод 'methodMissing' внутри строителя должен быть выполнен. – tylerwal

+0

Ницца, это, похоже, тоже работает. Благодаря :) – biddlesby

ответ

1

Aha! Я нашел решение. Это не так интересно, как использовать загрузчик классов, но он работает:

publishing { 
    files.each { f -> 
     publications.create(f, IvyPublication) { 
      module f 
      artifact (file(f)) 
     } 
    } 
}