Gradle задача не должна выполняться автоматически
Я определяю задачу в gradle:
task releaseCandidate(type: Exec) {
commandLine 'git', 'checkout', 'develop'
// Increment version code in Manifest
String manifest = new File('AndroidManifest.xml').getText('UTF-8')
Pattern pattern = Pattern.compile('android:versionCode="([0-9]+)"')
Matcher matcher = pattern.matcher(manifest)
matcher.find()
int newVersionCode = Integer.parseInt(matcher.group(1)) + 1
manifest = manifest.replaceAll(
"android:versionCode=\"([0-9]+)\"", "android:versionCode=\"$newVersionCode\""
)
new File('AndroidManifest.xml').write(manifest, 'UTF-8')
commandLine 'git', 'diff'
}
Что я хочу выполнить только тогда, когда я прямо называю его gradle releaseCandidate
. Однако, когда я запускаю любую другую задачу, например gradle assembleDebug
, она также запускает задачу releaseCandidate. Я не хочу, чтобы такое поведение происходило. Нет задачи в зависимости от releaseCandidate или наоборот.
Мой проект - приложение для Android, поэтому я использую плагин android
gradle.
Ответы
Ответ 1
Обычная ловушка. Добавьте действие к задаче, иначе код будет запущен на этапе конфигурации. Пример задачи с действием:
task sample << {
}
Как я вижу, вам лучше написать настраиваемую задачу, чем использовать тип Exec
. Я полагаю, что это недействительно для определения commandLine
дважды.
Ответ 2
Вы смешиваете конфигурацию задач и код groovy. Все, что является частью основного определения задачи, будет выполнено на этапе конфигурации. task task1 << { code }
является сокращением для
task task1 {
doLast {
code
}
}
commandLine
является частью Exec Task, но ваш другой код не является и должен быть заключен в doLast
, это сначала выполнит командную строку, а затем выполнит ваш дополнительный код. Если вам нужен другой exec commandLine
, вам понадобится другая задача.
task releaseCandidate(type: Exec) {
commandLine 'git', 'checkout', 'develop'
doLast {
// Increment version code in Manifest
String manifest = new File('AndroidManifest.xml').getText('UTF-8')
Pattern pattern = Pattern.compile('android:versionCode="([0-9]+)"')
Matcher matcher = pattern.matcher(manifest)
matcher.find()
int newVersionCode = Integer.parseInt(matcher.group(1)) + 1
manifest = manifest.replaceAll(
"android:versionCode=\"([0-9]+)\"", "android:versionCode=\"$newVersionCode\""
)
new File('AndroidManifest.xml').write(manifest, 'UTF-8')
}
}
Ответ 3
Просто для завершения ответа @Opal для случаев, когда действительно используется Exec (например, ссылка CommandLine):
task task1 << {
exec {
List<String> arguments = new ArrayList<String>()
//..
commandLine arguments
}
}