1

我想将工件发布到 ivy 存储库,但它不起作用。我阅读了这篇文章,并在阅读后创建了这个示例构建:

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'

4

1 回答 1

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 = ...声明一个额外的属性,一个附加到现有对象的新属性,该属性在对象(在本例中为任务)可见的任何地方都可见。您可以在Gradle 用户指南中阅读更多关于额外属性的信息

于 2013-06-03T07:33:15.283 回答