Задача генератора кода в многопроектной сборке Gradle - PullRequest
0 голосов
/ 27 ноября 2018

Я изучил тысячи подобных вопросов по SO, и я все еще потерялся.У меня есть простая многопроектная сборка:

rootProject.name = 'mwe'
include ":Generator"
include ":projectB"
include ":projectC"

с верхним уровнем build.gradle следующим образом (settings.gradle):

plugins { id "java" } 
allprojects { repositories { jcenter() } }

и с двумя типами файлов проекта build.gradle,Первый (Generator) предоставляет команду запуска, которая запускает генератор с аргументом командной строки:

plugins { 
  id "application" 
  id "scala"
}

dependencies { compile "org.scala-lang:scala-library:2.12.3" }
mainClassName = "Main"
ext { cmdlineargs = "" }
run { args cmdlineargs }

Генератор кода должен вызываться из projectB (и аналогичного projectC, и многих других),Я пытаюсь сделать это следующим образом (projectB / build.gradle):

task TEST {
  project (":Generator").ext.cmdlineargs = "Hurray!"
  println ("Value set:" + project(":Generator").ext.cmdlineargs )
  dependsOn (":Generator:run")
}

Что бы я ни пытался сделать (новичок здесь), я не получаю то, что мне нужно.У меня две проблемы:

  • Свойство cmdlineargs не установлено в момент запуска задачи :projectB:TEST.println видит правильное значение, но аргумент, передаваемый исполняемому основному методу, - это аргумент, настроенный в Generator/build.gradle, а не аргумент в projectB/build.gradle.Как указывалось в ответах, это может быть обходной прием с использованием отложенной оценки свойств, но это не решает вторую проблему.
  • Генератор запускается только один раз, даже если я собираю и projectB, и projectC.Мне нужно запустить Generator:run для каждого из projectB и projectC отдельно (для генерации разных источников для каждого зависимого проекта).

Как мне заставить это работать?Я полагаю, что нужна совершенно другая стратегия.Мне не нужно использовать командную строку и запустить;Я также могу попытаться запустить основной класс генератора более напрямую и передать ему аргументы, но я нахожу задачу запуска довольно удобной (сложный путь к классу устанавливается автоматически и т. Д.).Генератор - это сам проект Java / Scala, который скомпилирован в одной и той же многопроектной сборке.

1 Ответ

0 голосов
/ 28 ноября 2018

Примечание: задачи не похожи на методы в Java.Задача будет выполняться 0 или 1 раз за вызов gradle.Задача никогда не будет выполняться дважды (или более) за один вызов Gradle

Я думаю, что вы хотите две или более задач.Например:

task run1(type:xxx) {
    args 'foo'
}
task run2(type:xxx) {
    args 'bar'
} 

Тогда вы можете зависеть от run1 или run2 в других ваших проектах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...