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:结束
插件执行的许多配置maven-publish都是惰性完成的。
包裹起来afterEvaluate应该可以。
afterEvaluate { evaluated ->
evaluated.tasks.findByName("publishMyMediaPublicationToSnapshotRepository").configure {
println it.name
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3124 次 |
| 最近记录: |