2016-09-06 2 views
1

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

Моя структура каталогов выглядит следующим образом:

[Root] 
---->[projA] 
----------->build.gradle 
---->[projB] 
----------->build.gradle 

Так что я projB зависит от projA в моем коде. Скажем, у меня есть запуск задачи в projB:

task run << { 
    println 'projB running' 
} 

И я также запуск задачи в projA:

task run << { 
    println 'projA running' 
} 

, позвонив Gradle запустить, я хотел бы получить

:run 
projB running 
:projA:run 
projA running 

Есть ли способ предотвратить выполнение некоторыми из задач этой зависимости? Некоторые из них, скажем, clean все в порядке, но я предпочел бы, чтобы отдельные задачи выполнялись отдельно (без изменения схемы именования).

эквивалент того, что я хочу, может быть достигнуто, выполнив:

gradle run -x :projA:run 

или

gradle :run 

Я хочу, чтобы решение, которое в файле сборки, хотя.

Спасибо!

+0

Если вы знаете, что хотите выполнить задачу 'run' для определенного подпроекта, почему бы не сказать Gradle об этом в командной строке, например. через 'gradle: projB: run'? Это выполнит только задачу 'run' для проекта' projB', но не для 'projA'. –

+0

Потому что я хочу что-то в файле сборки ... – AlexG

ответ

3

Тот факт, что projB заявляет, что зависимость проекта от projA не имеет отношения к поведению, которое вы видите. Если вы выполняете задачу из корневого проекта многопроектной сборки, то Gradle попытается найти задачу в любым своих подпроектов с запрошенным именем и выполнить его. Эта функция называется task execution matching. Учитывая это поведение по умолчанию, Gradle не знает, какую из задач run вы имеете в виду при выполнении gradle run из корневого проекта. Я предлагаю вам определить, что вы хотите выполнить в командной строке, как указано в моем предыдущем комментарии.

Если вы действительно хотите добавить логику сценария сборки, то вы могли бы добиться этого с помощью следующего кода:

def taskRequests = gradle.startParameter.taskRequests 
def runTaskRequest = taskRequests.find { it.args.contains('run') } 

if (runTaskRequest) { 
    gradle.startParameter.excludedTaskNames = [':projA:run'] 
} 

кода, предоставленного бы предотвратить выполнение run задачи для подпроекта projA, если вы выполните команду gradle run. Имейте в виду, что он также исключает :projA:run, если вы перейдете в подкаталог projA и запустите ту же команду. Если вы все еще хотите выполнить задачу run из подкаталога, вам придется построить дополнительную логику.

+0

Спасибо. Это в значительной степени то, что я ожидал сделать.Причиной этого является, в основном, идиот-защита. Я не хочу, чтобы кто-то (или я) случайно пропустил двоеточие и создал сборку дополнительных процессов. – AlexG

Смежные вопросы