В настоящее время я оцениваю gradle как альтернативу Maven для сборки муравейника + плюща, созданного на собственной конвенции. Сборка ant + ivy разработана для обеспечения стандартной среды для широкого спектра приложений j2se и поддерживает следующую стандартную компоновку для конфигурации приложения
conf/
fooPROD.properties
fooUAT.properties
bar.properties
UK/
bazPROD.properties
bazUAT.properties
Если я выберу сборку для UAT, я получу
conf/
foo.properties
bar.properties
UK/
baz.properties
т.е. он копирует файлы с суффиксом целевой среды (в данном случае UAT), а также все, что не имеет такого шаблона. Наряду с этим происходит множество других вещей, которые усложняют ситуацию, но это является ядром моей нынешней проблемы.
Я играл с различными функциями gradle, переписывая это, а не просто заставляя его работать. Мой текущий подход состоит в том, чтобы позволить таргетинг-файлу быть предоставленным на лету, вот так
tasks.addRule("Pattern: make<ID>") { String taskName ->
task(taskName).dependsOn tasks['make']
}
Задача make имеет дело с различным копированием / фильтрацией / преобразованием файлов conf из src в область сборки. Для этого нужно выяснить, что представляет собой targettenv, которым я сейчас занимаюсь после создания DAG
gradle.taskGraph.whenReady {taskGraph ->
def makeTasks = taskGraph.getAllTasks().findAll{
it.name.startsWith('make') && it.name != 'make'
}
if (makeTasks.size() == 1) {
project.targetEnv = makeTasks[0].name - 'make'
} else {
// TODO work out how to support building n configs at once
}
}
(такое чувство, что должен быть более быстрый / более идиоматический способ сделать это, но я отвлекся)
Затем я могу запустить его как gradle makeUAT
Моя проблема в том, что установка targetEnv
таким образом означает, что targetEnv
не установлен во время конфигурации. Поэтому, если у меня есть задача копирования, как
task prepareEnvSpecificDist(type: Copy) {
from 'src/main/conf'
into "$buildDir/conf"
include "**/*$project.targetEnv.*"
rename "(.*)$project.targetEnv.(.*)", '$1.$2'
}
он не делает то, что я хочу, потому что $project.targetEnv
еще не установлен. Наивно я изменил это на
task prepareEnvSpecificDist(type: Copy) << {
from 'src/main/conf'
into "$buildDir/conf"
include "**/*$project.targetEnv.*"
rename "(.*)$project.targetEnv.(.*)", '$1.$2'
}
однажды я понял, что происходит. Это тогда терпит неудачу как
Skipping task ':prepareEnvSpecificDist' as it has no source files.
потому что я не настроил задачу копирования, чтобы сообщить ей, какие есть входы и выходы.
Вопрос: как решить проблему конфигурации задачи, основанную на свойствах, которые становятся конкретными после завершения конфигурации?
NB: Я понимаю, что могу передать системное свойство и сделать что-то вроде gradle -Dtarget.env=UAT make
, но это довольно многословно, и я все равно хочу разобраться, что происходит.
Приветствия
Мэтт