Gradle - 发布工件

时间:2013-06-03 07:12:42

标签: gradle ivy

我想将工件发布到ivy存储库但它不起作用。我读了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'

1 个答案:

答案 0 :(得分:1)

在Groovy中,def创建一个局部变量,它是词法范围的。因此,fileToPublish在任务操作之外不可见。此外,必须在配置阶段中完成配置(即,任务操作中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的更多信息。