Статьи

Gradle Good: использование CopySpec с задачами

Чтобы определить задачу Copy мы указываем файлы, которые мы хотим скопировать и в какой каталог. Это определение является экземпляром CopySpec . Он содержит правила, которые определяют, что мы хотим скопировать. Архивные задачи Jar , Zip и Tar также используют экземпляр CopySpec .

Когда мы создаем задачу типа Copy мы получаем объект задачи, который реализует интерфейс CopySpec . Мы можем использовать все методы этого интерфейса, чтобы расширить наш рецепт копирования задач. В следующем файле сборки мы сначала определим website задачи. Мы используем методы CopySpec для настройки задачи. Затем мы определяем задачу deploy типа Sync которая также реализует интерфейс CopySpec .

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
// Create a new task of type Copy.
// The website task is of type Copy
// and this means it implements the
// CopySpec interface.
task website(type: Copy) {
    into "${buildDir}/website"
    from 'src/webroot'
 
    into 'resources', {
        from 'src/assets'
    }
}
 
// We can use all CopySpec methods
// to add new specifications to
// the existing specifications.
website.into('resources') {
    from 'src/javascript'
}
 
// The copySpec method creates
// a CopySpec instance
// from the closure.
// The copySpec method is part of the
// Project object.
CopySpec manualSpec = copySpec {
    from('src/manual') {
        include '**/*.html'
    }
}
// And the with method accepts
// the CopySpec we created.
website.with(manualSpec)
 
// Print each file path
// that is copied.
website.eachFile {
    println it.path
}
 
// New task of type Sync.
// The Sync task is also implementing
// the CopySpec interface.
// (Just like archive tasks: Zip, Tar, Jar)
task deploy(type: Sync) {
    destinationDir = file("${buildDir}/production")
    from website
}
 
// Use rename method from CopySpec.
deploy.rename { file ->
    if (file == 'index.html') {
        'main.html'
    } else {
        file
    }
}
 
// And finally the exclude method.
deploy.exclude 'man.html'

Когда мы запускаем задачу deploy и смотрим на файлы в каталоге build мы видим, как выполняются наши спецификации копирования:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
$ gradle deploy
:website
index.html
resources/app.js
resources/site.css
man.html
:deploy
 
BUILD SUCCESSFUL
 
Total time: 3.643 secs
$ tree build/
build
├── production
│   ├── main.html
│   └── resources
│       ├── app.js
│       └── site.css
└── website
    ├── index.html
    ├── man.html
    └── resources
        ├── app.js
        └── site.css
 
4 directories, 7 files
Ссылка: Совершенство Gradle: Использование CopySpec с заданиями от нашего партнера по JCG Хьюберта Кляйна Иккинка в блоге JDriven .