【发布时间】:2020-02-17 11:28:55
【问题描述】:
我正在使用 maven-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 确实预先配置了任务 publishHelmMediaPublicationToSnapshotRepository。 gradlew tasks --all 也会打印出这个任务。
这种行为让我看起来更加困惑。
编辑 3:结束
【问题讨论】:
-
检查拼写,应该是
SnapshotRepository。 -
@MartinZeitler 这不是问题所在。这是写这篇文章时的一个错字。但是感谢您指出这一点。
-
我已经更正了帖子中的错字
标签: gradle build.gradle gradle-plugin