Конфигурация плагина публикации Gradle maven имеет ссылку на динамически созданную задачу gradle

У меня есть блок конфигурации публикации, который выглядит так в моем файле build.gradle.

publishing {
publications {
    maven(MavenPublication) {
        groupId "groupId"
        artifactId 'artifactId'
        version "4.0"
        artifact "$buildDir/outputs/aar/artifact-release.aar"
        artifact releaseJavadocsJar

        // Generate pom file so that the artifact dependencies can be fetched automatically.
        pom.withXml {
            def dependenciesNode = asNode().appendNode('dependencies')
            configurations.compile.allDependencies.each { dependency ->
                def dependencyNode = dependenciesNode.appendNode('dependency')
                dependencyNode.appendNode('groupId', dependency.group)
                dependencyNode.appendNode('artifactId', dependency.name)
                dependencyNode.appendNode('version', dependency.version)
            }
        }
    }
}

}

обратите внимание на releaseJavadocsJar, это задача gradle, определенная следующим образом:

  android.libraryVariants.all { variant ->
    if (variant.name == 'release') {
        def taskJavadoc = task("releaseJavadocs", type: Javadoc) {
            source = variant.javaCompile.source
            classpath = files(((Object) android.bootClasspath.join(File.pathSeparator)))
            classpath += files(variant.javaCompile.classpath.files)
        }
        task("releaseJavadocsJar", type: Jar) {
            classifier = 'javadoc'
            from taskJavadoc.destinationDir
        }
    }
}

Когда я синхронизирую эту строку

   artifact releaseJavadocsJar

из публикации жалуется, что

Error:(62, 0) Could not get unknown property 'releaseJavadocsJar' for object of type org.gradle.api.publish.maven.internal.publication.DefaultMavenPublication.

это означает, что моя динамически созданная задача еще не существует, когда происходит синхронизация градиента.

Есть ли способ обойти это?


person sakis kaliakoudas    schedule 24.09.2017    source источник
comment
Попробуйте переместить блок кода с определением releaseJavadocsJar перед блоком publishing.   -  person Opal    schedule 24.09.2017
comment
определение находится перед блоком публикации, но блок публикации все равно вызывается первым   -  person sakis kaliakoudas    schedule 25.09.2017
comment
На мгновение я подумал, что вы можете изменить порядок плагинов, но это не поможет. Вы можете попробовать переместить блок publishing в замыкание project.afterEvaluate. В этом блоке оценивается весь проект и добавляются все задачи. Не могли бы вы попробовать это?   -  person Opal    schedule 25.09.2017
comment
спасибо за предложение. К сожалению, это тоже не работает, так как libraryVariants.all, похоже, сам оценивается поздно. Я добавил пару операторов журнала, чтобы подтвердить это, и увидел, что хотя доступ к блоку android осуществляется до блока публикации, блок libraryVariants.all нет.   -  person sakis kaliakoudas    schedule 26.09.2017
comment
Хорошо, так что не могу вам помочь. Я не Android-разработчик, поэтому даже не могу попробовать. Но более или менее это направление, в котором я бы двигался - порядок, в котором все это оценивается.   -  person Opal    schedule 26.09.2017
comment
Спасибо за попытку. Есть ли какие-нибудь команды, похожие на project.afterEvaluate, которые я могу попробовать?   -  person sakis kaliakoudas    schedule 26.09.2017
comment
Скорее нет, насколько я помню. Не могли бы вы попробовать также: artifact "releaseJavadocsJar"?   -  person Opal    schedule 26.09.2017
comment
Я пробовал, не получилось. Но я нашел способ обойти это, проверьте мой ответ ниже. В очередной раз благодарим за помощь!   -  person sakis kaliakoudas    schedule 26.09.2017
comment
Хорошо выглядит, круто!   -  person Opal    schedule 26.09.2017


Ответы (1)


Обернуть его в блок project.afterEvalute не сработало, но это сработало:

project.tasks.whenTaskAdded { addedTask ->
if (addedTask.name == 'releaseJavadocsJar') {
    // Publishing to local maven repo via 'gradlew publishToMavenLocal'.
    publishing.publications {
         maven(MavenPublication) {
    groupId "groupId"
    artifactId 'artifactId'
    version "4.0"
    artifact "$buildDir/outputs/aar/artifact-release.aar"
    artifact releaseJavadocsJar

    // Generate pom file so that the artifact dependencies can be fetched automatically.
    pom.withXml {
        def dependenciesNode = asNode().appendNode('dependencies')
        configurations.compile.allDependencies.each { dependency ->
            def dependencyNode = dependenciesNode.appendNode('dependency')
            dependencyNode.appendNode('groupId', dependency.group)
            dependencyNode.appendNode('artifactId', dependency.name)
            dependencyNode.appendNode('version', dependency.version)
        }
    }
}
person sakis kaliakoudas    schedule 26.09.2017