Gradle - публиковать артефакты

Я хочу опубликовать артефакты в репозитории 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'


person pepuch    schedule 03.06.2013    source источник


Ответы (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.

person Peter Niederwieser    schedule 03.06.2013
comment
Спасибо, но теперь gradle показывает эту ошибку Could not find method archives() for arguments [build\file.abc, build_343353k3f117pa3tdkoiplr9of$_run_closure2_clos... - person pepuch; 03.06.2013
comment
Вероятно, вы не применили плагин, такой как java, который объявляет archives конфигурацию. Ознакомьтесь с образцами сборок в полном дистрибутиве Gradle. - person Peter Niederwieser; 03.06.2013
comment
Хорошо, сейчас я понимаю. Могу ли я опубликовать артефакт без какого-либо плагина? - person pepuch; 03.06.2013