findByName() 方法为 gradle 插件任务返回 null

Asi*_*ick 1 gradle build.gradle gradle-plugin

我正在使用maven-publis h 插件。我有一个名为myMedia 的出版物。当我尝试执行时 tasks.findByName("publishMyMediaPublicationToSnapshotRepository"),它返回null。如果 maven-publish 插件创建了同名任务,为什么它会返回 null。

我无法解决这个问题。任何帮助是极大的赞赏。

编辑1:开始

我尝试了 Francisco Mateo 的建议,使用 afterEvaluate 方法,但这似乎也不适合我。

然而,在试图找出真正的原因时,我发现了一个有趣的观察结果。我发现当我 tasks.findByName("publishMyMediaPublicationToSnapshotRepository")从任务中调用时,它工作得很好并打印出任务,即printTaskName按预期运行:

task printTaskName{
   doLast{
println "task name found is :--- "+tasks.findByName("publishMyMediaPublicationToSnapshotRepository")
   }
}
Run Code Online (Sandbox Code Playgroud)

现在,最初在我的项目的 build.gradle 中,我有一个publishSnapshot任务,然后使用MustRunAfter方法进行排序逻辑:

task publishSnapshot (dependsOn: ['createMyMediaArchive','publishMyMediaPublicationToSnapshotRepository'])
tasks.findByName("publishMyMediaPublicationToSnapshotRepository").mustRunAfter tasks.findByName("createMyMediaArchive")
publishSnapshot.mustRunAfter tasks.findByName("publishMyMediaPublicationToSnapshotRepository")
Run Code Online (Sandbox Code Playgroud)

执行publishSnapshot任务会出现以下错误:

Cannot invoke method mustRunAfter() on null object
Run Code Online (Sandbox Code Playgroud)

tasks.findByName方法在这里似乎不起作用,因为它返回 null。

我是否错过了一些基础知识?

编辑1:结束

编辑2:开始

下面的 build.gradle 是我实际拥有的版本的编辑版本。我不被允许分享脚本。但该脚本的结构与我所拥有的相同。构建脚本的其余部分在结构和语法方面保持不变,只是名称发生了变化。Gradle 版本是3.5.1

构建.gradle

import java.time.LocalDate;
import java.time.format.DateTimeFormatter
import java.text.SimpleDateFormat
import Tasks.PublishArtifacts
import org.gradle.api.GradleException

buildscript {
       repositories {
          abcRelease() 
       }
       dependencies {
           classpath "org.codehaus.groovy.modules.http-builder:http-builder:0.7"
           classpath "commons-collections:commons-collections:3.2.1"
           classpath "org.jfrog.buildinfo:build-info-extractor-gradle:4.9.10"
       }
}

 repositories {
    mavenCentral()
    abcSnapshot()
    xyzRelease()
 }

apply plugin: 'maven-publish'
apply plugin: 'base'
apply plugin:'java'

apply from: "$rootDir/repositories.gradle"

def getMediaVersion(){
   project.mediaVersion
}

configurations{
    releaseMedia
}

 publishing{
      publications {
        myMedia(MavenPublication) {
            artifactId project.artifactId
            artifact "$project.artifactId"+"-"+getMediaVersion()+".tgz"
            version getMediaVersion()
        }
 }
         repositories project.artifactoryRepositories
 }

task publishSnapshot (dependsOn: ['createMyMediaArchive','publishMyMediaPublicationToSnapshotRepository'])

tasks.findByName("publishMyMediaPublicationToSnapshotRepository").mustRunAfter tasks.findByName("createMyMediaArchive")
publishSnapshot.mustRunAfter tasks.findByName("publishMyMediaPublicationToSnapshotRepository")

afterEvaluate { evaluated -> 
    evaluated.tasks.findByName("publishMyMediaPublicationToSnapshotRepository").configure {
        println "My Media name  ---------   "+it.name
    }
}

task printTaskName{
   doLast{
println "task name found is :--- "+tasks.findByName("publishMyMediaPublicationToSnapshotRepository") // This returns task name as exected
   }
}

task createMyMediaArchive{
   doLast{
      //code for creating media
   }
}
Run Code Online (Sandbox Code Playgroud)

编辑2:结束

编辑3:开始

如果我单独运行任务,即首先运行任务createMyMediaArchive,然后运行任务publishSnapshot,其中任务publishSnapshot取决于任务publishHelmMediaPublicationToSnapshotRepository,即。

task publishSnapshot (dependsOn: ['publishHelmMediaPublicationToSnapshotRepository'])
Run Code Online (Sandbox Code Playgroud)

然后两个任务都成功运行。这证明 gradle 确实预先配置了publishHelmMediaPublicationToSnapshotRepository任务。另外gradlewtasks --all打印出这个任务。

这种行为让我看起来更加困惑。

编辑 3:结束

Fra*_*teo 5

插件执行的许多配置maven-publish都是惰性完成的。

包裹起来afterEvaluate应该可以。

afterEvaluate { evaluated -> 
    evaluated.tasks.findByName("publishMyMediaPublicationToSnapshotRepository").configure {
        println it.name
    }
}
Run Code Online (Sandbox Code Playgroud)