Задача Gradle Copy: миграция из Ant в Gradle

Я новичок в gradle и переношу скрипт ant build.xml в gradle. Обычно задачи копирования довольно просты и понятны, но я наткнулся на эту небольшую сложную задачу копирования (может быть, тоже простую), в которой включены подробные сведения и набор файлов. Могу ли я узнать, как преобразовать этот код муравья в задачу Gradle?

<copy todir="client" verbose="true">
        <fileset dir="${build.classes}">
        <include name="com/corp/domain/**" />                   
      </fileset>
   </copy>

Задача Gradle, которую я пытался написать до сих пор,

task copyDocs(type: Copy) {
  from 'dist'
  include "com/corp/domain/**"
  into 'client'
}

Мне нужно знать, как можно использовать набор файлов и подробное описание, чтобы сделать его идеальной переносимой задачей.


person ronypatil    schedule 14.07.2017    source источник


Ответы (2)


Ваша задача Gradle уже делает почти все правильно. <fileset> в Ant - это группа файлов. Используя dir=, вы можете начать с одного каталога и включить или исключить подмножество всех файлов в этом каталоге. Это поведение уже реализовано Gradle _3 _ задача, потому что она реализует CopySpec интерфейс. Итак, только для одного Ant <fileset> вы можете использовать задачу Copy и ее методы, как вы это делали в своем примере:

task copyDocs(type: Copy) {
    from 'path/to/dir'
    include 'com/corp/domain/**'
    into 'client'
}

Если вам нужно использовать несколько <fileset> элементов, вы можете добавить дочерний CopySpec для каждого из них, например с помощью метода from с последующим закрытием. Конфигурации в этом закрытии будут применяться только к файлам из этого каталога, как и настройка одного <fileset>:

task copyDocs(type: Copy) {
    from('dir1') {
        include 'foo/bar'
    }
    from('dir2') {
        exclude 'bar/foo'
    }
    into 'dir3'
}

${build.classes} относится к свойству Ant. Поскольку Gradle основан на Groovy, вы можете определять свое свойство в различных местах и ​​способами (например, дополнительные свойства), но имейте в виду, что build - это имя задачи, которое присутствует почти во всех сценариях сборки Gradle, поэтому использование build.classes напрямую, вероятно, будет искать свойство в области видимости. задачи build:

task copyDocs(type: Copy) {
    // if you defined the property before
    from my.build.classes
    include 'com/corp/domain/**'
    into 'client'
}

Атрибут verbose только определяет, должны ли все операции копирования файлов регистрироваться на консоли. Gradle не поддерживает ведение журнала файлов с помощью простой опции, поэтому нам нужно реализовать ее самостоятельно. К счастью, Gradle предоставляет метод eachFile. Мы можем передать закрытие, которое вызывается для каждого скопированного файла и содержит _ 20_. Я не знаю, как Ant регистрирует скопированные файлы, но одним из способов может быть следующее:

task copyDocs(type: Copy) {
    // ...
    eachFile { details ->
        println "Copying $details.sourcePath to $details.path ..."
    }
}
person Lukas Körfer    schedule 15.07.2017

@ronypatil, следующий код может послужить вам хорошим ориентиром для решения проблемы:

task copyDocs(type: Copy) {
    FileTree tree = fileTree("dist")
    tree.include "com/corp/domain/**"

    File toPath = file("client")

    tree.each { File file ->
        from file
        into toPath
        println "copy $file into $toPath"
    }
}
person chenrui    schedule 14.07.2017