Есть ли способ считывать параметры командной строки из задачи gradle?

#gradle #artifactory #publish #ivy

#gradle #artifactory #опубликовать #ivy

Вопрос:

Я ищу способ отключить большую часть стека обработки моего подпроекта, если я знаю, что он уже создан и опубликован. Я управляю проектом с 400 подпроектами, и я могу сэкономить кучу времени, проверяя, действительно ли мне нужно создавать подпроект или нет.

Моя попытка сделать это заканчивается тем, что у меня есть блок внутри задачи, который вызывает

 task disablePublish{
  if (the resultant product is already published.)
  {
    project.tasks.all {
      task -> task.enabled = false
    }
  }
}
...
publish.dependsOn  = [disablePublish]
  

Когда я вызываю publish , это, похоже, отлично работает, если rpm уже опубликован, он не публикует, а создает его и публикует, если это не так.

Однако, похоже, что построение прерывается, если я не вызываю publish, если опубликован rpm.

 Skipping task 'mytask' as task onlyIf is false.
  

И rpm не создается.

если я закомментирую

 project.tasks.all {
  task -> task.enabled = false
}
  

сборка работает отлично.

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

Спасибо за ваше время и внимание.

Ответ №1:

Я ищу способ отключить большую часть стека обработки моего подпроекта, если я знаю, что он уже создан [и опубликован].

Взгляните на инкрементные сборки. Gradle может определить, нужно ли запускать задачу или нет, если входные и выходные данные задачи определены правильно. Это должно работать без проблем для задач, которые создают проект. Проверка того, был ли проект уже опубликован (и, следовательно, сборка не требуется), может быть затруднена, поскольку было бы сложно определить выходные данные задачи.

если мне действительно нужно создать подпроект или нет

Это фактически указывает на то, что вы должны решать свою проблему не на уровне задачи, а на уровне проекта. Существуют ли какие-либо зависимости между проектами или они просто являются частью одной и той же сборки с несколькими проектами, потому что удобно запускать одну команду для всех проектов? Взгляните на разницу между сборками с несколькими проектами и составными сборками.

Моя попытка сделать это заканчивается тем, что у меня есть блок внутри задачи, который вызывает

Это не совсем так.Есть задача и есть блок кода, но они связаны не так, как вы думаете. На самом деле, ваш код работал бы точно так же, если бы он выглядел так:

 if (the resultant product is already published.)
{
  project.tasks.all {
    task -> task.enabled = false
  }
}

task disablePublish {
}
  

Почему это так? Ну, какой бы код ни помещался внутри замыкания при создании задачи, он не определяет, что происходит при выполнении задачи. Вместо этого код запускается непосредственно для настройки задачи. При выполнении задачи выполняются только (внутренние) действия задачи doFirst и doLast закрытия (либо потому, что это было упомянуто в командной строке, либо из-за dependsOn ):

 println 'Before creating the task'

task myTask {
    println 'Task is configured'
    doLast {
        println 'Task is executed'
    }
}

println 'After creating the task'
  

Просто поместите приведенный выше код в build.gradle файл и запустите gradle myTask из того же каталога. Оператор 'Task is executed' будет напечатан последним. Теперь просто вызывайте gradle без какой-либо задачи, определенной в командной строке. Gradle напечатает все инструкции рядом 'Task is executed' , показывая, что каждая задача настраивается при каждом вызове gradle .

Это показывает, что ваша логика «задачи» применяется при каждом запуске Gradle. Однако задача disablePublish остается пустой и вообще ничего не делает.

Когда я вызываю publish , это, похоже, отлично работает, если rpm уже опубликован, он не публикует, а создает его и публикует, если это не так.

Ну, это зависит от состояния if блока, поскольку это условие в основном включает или отключает весь ваш проект. Конечно, если условие равно false , проект будет работать совершенно нормально, если условие равно true , ни одна задача не будет выполнена вообще.

Однако, похоже, что построение прерывается, если я не вызываю publish, если опубликован rpm.

Если он опубликован (и ваше if условие подтверждает это), весь ваш проект ничего не будет делать, так как каждая задача отключена. Поскольку эта логика применяется независимо от какой-либо задачи, это не имеет никакого отношения к publish задаче.

Комментарии:

1. Спасибо за ваш подробный и многогранный ответ, и он согласуется с тем, что я видел. Я думаю, что решение состоит в том, чтобы превратить мое условие в опубликованную задачу, оно может выводить логическое значение. Это должно отлично работать. Мне нравятся ваши комментарии по составным сборкам. Я рассматривал возможность написания пользовательской оболочки gradle, чтобы скрыть большую часть сценариев родительского проекта, похоже, это тоже может помочь.