Gradle многоразовые пользовательские задачи для каждого модуля проекта - PullRequest
0 голосов
/ 11 июня 2019

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

Например:

сценарий

#!/usr/bin/env sh
echo "$@"

build.gradle

task customExecTask(type: Exec) {
  if (project.name == "a") {
    commandLine './script', "Project 'a'"
  } else if (project.name == "b") {
    commandLine './script', "Project 'b'"
  }
}

project('a') {
  build.dependsOn ':customExecTask'
}

project('b') {
  build.dependsOn ':customExecTask'
}

EDIT

Или как-то так:

task customExecTask(type: Exec) {
  def dynamicVariable = ""
  commandLine './script', dynamicVariable
}

project('a') {
  task(':customExecTask').dynamicVariable = "Project 'a'"
  build.dependsOn ':customExecTask'
}

project('b') {
  task(':customExecTask').dynamicVariable = "Project 'b'"
  build.dependsOn ':customExecTask'
}

Ожидаемый результат:

$ gradle :a:build
Project 'a'

$ gradle :b:build
Project 'b'

Ответы [ 2 ]

0 голосов
/ 12 июня 2019

Я нашел решение.Что касается моего первого примера, я просто хотел выполнить скрипт, который находится в корневом каталоге проекта, с конкретными аргументами для каждого подпроекта.Чтобы задача работала правильно, вам нужно определить задачу в закрытии subprojects.Ниже приведен полностью рабочий пример для одной build.gradle настройки.

Структура каталогов:

├─ a                 # Module 'a' folder
├─ b                 # Module 'b' folder
├─ build.gradle      # Root project build file
├─ script            # Executable bash script
└─ **/               # Other files and folder

script

#!/usr/bin/env sh
echo "$@"

build.gradle

subprojects { // Define the task here
  task customExecTask(type: Exec) {
    // Change the directory where the script resides
    workingDir = rootDir
    // Conditional arguments depending on each project modules.
    // We'll use the property 'project.name' to determine the
    // current project this task is running from
    def customArgs = project.name == 'a' ? "Hello" : "World"
    // Then execute the script with customArgs variable
    commandLine './script', customArgs
    // Or in Windows: commandLine 'cmd', '/c', 'script.bat'
  }
}

project('a') {
  build.dependsOn 'customExecTask'
}

project('b') {
  build.dependsOn 'customExecTask'
}

Результат консоли:

$ gradle build

> Task :a:execute
Hello

> Task :b:execute
World
0 голосов
/ 11 июня 2019

См. Документацию по Использование подключаемых модулей Gradle .

В соответствии с этой темой вы можете поместить задачу в отдельный файл Gradle mytask.gradle ив каждом модуле, который вы добавляете в build.gradle:

apply from: "${rootDir}/pathtomycustomgradlefile/mytask.gradle"

Если вам нужно больше логики, чтобы решить, какой из них применить, вы можете проверить тему Применение плагинов к подпроектам .

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