【问题标题】:findByName() method returns null for gradle plugin taskfindByName() 方法为 gradle 插件任务返回 null
【发布时间】:2020-02-17 11:28:55
【问题描述】:

我正在使用 ma​​ven-publish 插件。我有一个名为 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")
   }
}

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

task publishSnapshot (dependsOn: ['createMyMediaArchive','publishMyMediaPublicationToSnapshotRepository'])
tasks.findByName("publishMyMediaPublicationToSnapshotRepository").mustRunAfter tasks.findByName("createMyMediaArchive")
publishSnapshot.mustRunAfter tasks.findByName("publishMyMediaPublicationToSnapshotRepository")

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

Cannot invoke method mustRunAfter() on null object

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

我错过了一些基础知识吗?

编辑 1:结束

编辑 2:开始

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

build.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
   }
}

编辑 2:结束

编辑 3:开始

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

task publishSnapshot (dependsOn: ['publishHelmMediaPublicationToSnapshotRepository'])

那么这两个任务都会成功运行。这证明 gradle 确实预先配置了任务 publishHelmMediaPublicationToSnapshotRepositorygradlew tasks --all 也会打印出这个任务。

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

编辑 3:结束

【问题讨论】:

  • 检查拼写,应该是SnapshotRepository
  • @MartinZeitler 这不是问题所在。这是写这篇文章时的一个错字。但是感谢您指出这一点。
  • 我已经更正了帖子中的错字

标签: gradle build.gradle gradle-plugin


【解决方案1】:

maven-publish 插件执行的很多配置都是懒惰的。

包裹在afterEvaluate 中应该可以工作。

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

【讨论】:

  • 不幸的是,这似乎不起作用。它仍然返回 null。但是,我注意到一种奇怪的行为。我会用更多的细节和进一步的发现更新我的 OP。
  • 请提供完整的build.gradle 文件,说明您如何配置maven-publish 插件的publishing 扩展并指定您使用的Gradle 版本。
  • 我已经添加了 build.gradle 代码。如果我错过了什么,请务必告诉我。
  • 如有任何问题,请告诉我
猜你喜欢
  • 2017-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-15
  • 2020-03-20
相关资源
最近更新 更多