Как я могу сделать uploadArchives зависимым от другой задачи?
У меня есть следующее в моем build.gradle
:
afterEvaluate { project ->
uploadArchives {
repositories {
mavenDeployer {
configuration = configurations.deployerJars
pom.packaging = "aar"
pom.groupId = project.CORE_GROUP
pom.version = project.CORE_VERSION_NAME
repository(url: "scp://" + project.CORE_MAVEN_URL) {
authentication(userName: project.uploadUsername, privateKey: project.uploadKeyFile)
}
}
}
}
}
И я хочу, чтобы это зависело от следующей задачи:
task checkProperties << {
if (!project.hasProperty('uploadUsername')) {
throw new RuntimeException("Couldn't find uploadUsername property. Did you forget to specify it in ~/.gradle/gradle.properties?")
} else if (!project.hasProperty('uploadKeyFile')) {
throw new RuntimeException("Couldn't find uploadKeyFile property. Did you forget to specify it in ~/.gradle/gradle.properties?")
}
}
Как мне этого добиться? Если я напишу следующее:
afterEvaluate { project ->
uploadArchives(dependsOn: checkProperties) {
repositories {
mavenDeployer {
configuration = configurations.deployerJars
pom.packaging = "aar"
pom.groupId = project.CORE_GROUP
pom.version = project.CORE_VERSION_NAME
repository(url: "scp://" + project.CORE_MAVEN_URL) {
authentication(userName: project.uploadUsername, privateKey: project.uploadKeyFile)
}
}
}
}
}
Тогда я получаю следующую ошибку:
FAILURE: Build failed with an exception.
* Where:
Build file '/Users/scottjohnson/Source/core-android/core/build.gradle' line: 61
* What went wrong:
A problem occurred configuring project ':core'.
> org.gradle.api.internal.MissingMethodException: Could not find method mavenDeployer() for arguments [build_42edqo477lbj5geoh0e3gdkj7q$_run_closure6_closure9_closure10_closure11@30b8afce] on repository container.
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.
BUILD FAILED
Total time: 7.68 secs
Кстати, причина, по которой я хочу сделать это, заключается в том, что прямо сейчас, если я просто помещу код, который проверяет свойства в uploadArchives
задача, то даже если я бегу ./gradlew clean build
он проверяет свойства (чего я не хочу, чтобы это происходило на моем сервере сборки, поскольку у него нет разрешения на фактическую загрузку архивов). Таким образом, метод, который будет проверять свойства только тогда, когда uploadArchives
задание выполнено также будет приемлемым.
3 ответа
Я смог понять это, основываясь частично на комментарии @Opal:
def checkProperties() {
if (!project.hasProperty('uploadUsername')) {
throw new RuntimeException("Couldn't find uploadUsername property. Did you forget to specify it in ~/.gradle/gradle.properties?")
} else if (!project.hasProperty('uploadKeyFile')) {
throw new RuntimeException("Couldn't find uploadKeyFile property. Did you forget to specify it in ~/.gradle/gradle.properties?")
}
}
uploadArchives {
repositories {
mavenDeployer {
configuration = configurations.deployerJars
pom.packaging = "aar"
pom.groupId = project.CORE_GROUP
pom.version = project.CORE_VERSION_NAME
repository(url: "scp://" + project.CORE_MAVEN_URL) {
}
}
}
}
// We need to check to make sure the properties are available before we execute
// uploadArchives.
gradle.taskGraph.beforeTask { Task aTask ->
if (aTask == uploadArchives) {
checkProperties()
aTask.repositories.mavenDeployer.repository(url: "scp://" + project.CORE_MAVEN_URL) {
authentication(userName: project.uploadUsername, privateKey: project.uploadKeyFile)
}
}
}
Что касается вашего сообщения об ошибке, вы можете пропустить применение плагина maven к файлу build.gradle (применить плагин: 'maven').
См.: https://discuss.gradle.org/t/configure-mavendeployer-programmatically/16956/2
Может быть, вы можете попробовать что-то вроде:
apply plugin: 'java'
def uploadUsername = project.hasProperty('uploadUsername') ? project['uploadUsername'] : ''
def uploadKeyFile = project.hasProperty('uploadKeyFile') ? project['uploadKeyFile'] : ''
uploadArchives { }
task checkProperties << {
if (!uploadUsername) {
throw new RuntimeException("Couldn't find uploadUsername property. Did you forget to specify it in ~/.gradle/gradle.properties?")
} else if (!uploadKeyFile) {
throw new RuntimeException("Couldn't find uploadKeyFile property. Did you forget to specify it in ~/.gradle/gradle.properties?")
}
}
uploadArchives.dependsOn(checkProperties)
В начале оба свойства читаются и присваиваются двум переменным. Если какой-либо из них не существует, будет назначено простое пустое значение. Это не мешает процессу сборки. затем uploadArchives
объявляется зависимым от checkProperties
, Если это вызвано checkProperties
будет выполняться и выбрасывать исключение, если любая из объявленных переменных пуста.