我想将 Artifact 发布到常春藤存储库,但这不起作用。我阅读了this article,并在阅读后创建了此示例构建:

task ivyPublishTest << {
    def buildDir = new File("build")
    buildDir.mkdirs()
    def fileToPublish = new File("build/file.abc")
    fileToPublish.write("asdasdasd")
}

artifacts {
    archives(ivyPublishTest.fileToPublish) {
        name 'gradle-test-artifact'
        builtBy ivyPublishTest
    }
}

uploadArchives {
    repositories {
        ivy {
            url "http://my.ivy.repo/ivyrep/shared"
        }
    }
}

当然,问题在于它不起作用。我收到此错误Could not find property 'fileToPublish' on task ':ivyPublishTest'

最佳答案

在Groovy中,def创建一个局部变量,该变量在词法范围内。因此,fileToPublish在任务 Action 外部不可见。此外,必须在配置阶段完成配置(即,在任务操作中声明和分配fileToPublish来不及了)。这是一个正确的解决方案:

task ivyPublishTest {
    // configuration (always evaluated)
    def buildDir = new File("build")
    ext.fileToPublish = new File("build/file.abc")
    doLast {
        // execution (only evaluated if and when the task executes)
        buildDir.mkdirs()
        fileToPublish.write("asdasdasd")
    }
}

artifacts {
    // configuration (always evaluated)
    archives(ivyPublishTest.fileToPublish) {
        name 'gradle-test-artifact'
        builtBy ivyPublishTest
    }
}
ext.fileToPublish = ...声明了一个额外的属性,即附加到现有对象的新属性,该对象在任何可见的对象(在本例中为任务)可见。您可以在here中阅读有关额外属性Gradle User Guide的更多信息。

10-01 06:22