findByName()方法为gradle插件任务返回null
我正在使用maven publish插件。我有一本名为《myMedia》的出版物。当我尝试执行时findByName()方法为gradle插件任务返回null,gradle,build.gradle,gradle-plugin,Gradle,Build.gradle,Gradle Plugin,我正在使用maven publish插件。我有一本名为《myMedia》的出版物。当我尝试执行时 tasks.findByName(“publishMyMediaPublicationToSnapshotRepository”),它返回null。如果maven publish插件创建了一个同名的任务,为什么会返回null 我无法回避这个问题。非常感谢您的帮助 编辑1:开始 我尝试了Francisco Mateo的建议,使用afterEvaluate方法,但这似乎对我也不起作用 然而,在试图找出真
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:END
编辑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取决于
任务将媒体发布到快照存储库,即
task publishSnapshot (dependsOn: ['publishHelmMediaPublicationToSnapshotRepository'])
然后两个任务都成功运行。这证明gradle确实预先配置了任务publishHelmMediaPublicationToSnapshotRepository。
还有gradlew任务--all打印此任务
这种行为让我看起来更困惑
edit3:END许多由
maven publish
插件执行的配置都是惰性完成的
在评估后包装
应该可以工作
afterEvaluate { evaluated ->
evaluated.tasks.findByName("publishMyMediaPublicationToSnapshotRepository").configure {
println it.name
}
}
检查拼写,这可能应该是
SnapshotRepository
@MartinZeitler,这不是问题所在。写这篇文章的时候是个打字错误。但是谢谢你指出。我已经纠正了错误的姿势,这似乎不起作用。它仍然返回null。然而,我注意到一个奇怪的行为。我将用更多详细信息和进一步的发现更新我的OP。请提供完整的build.gradle
文件,显示您如何配置maven publish
插件的publishing
扩展名,并指定您正在使用的gradle版本。我已经添加了build.gradle代码。如果我错过了什么,请务必告诉我。如果有任何问题,请务必告诉我