build.gradle
task anotherCopyTask(type: Copy) {
// Copy everything under src/main/webapp
from 'src/main/webapp'
// Copy a single file
from 'src/staging/index.html'
// Copy the output of a task
from copyTask
// Copy the output of a task using Task outputs explicitly.
from copyTaskWithPatterns.outputs
// Copy the contents of a Zip file
from zipTree('src/main/assets.zip')
// Determine the destination directory later
into { getDestDir() }
}
您可以使用 Ant 风格的包含或排除模式,或使用一个闭包,来选择要复制的文件:
选择要复制的文件
build.gradle
task copyTaskWithPatterns(type: Copy) {
from 'src/main/webapp'
into 'build/explodedWar'
include '**/*.html'
include '**/*.jsp'
exclude { details -> details.file.name.endsWith('.html') && details.file.text.contains('staging') }
}
此外,你也可以使用 Project.copy()方法来复制文件。它是与任务一样的工作方式,尽管它有一些主要的限制。首先, copy()不能进行增量操作。
使用没有最新状态检查的 copy() 方法复制文件
build.gradle
task copyMethod << {
copy {
from 'src/main/webapp'
into 'build/explodedWar'
include '**/*.html'
include '**/*.jsp'
}
}
第二,当一个任务用作复制源(即作为 from() 的参数)的时候,copy()方法不能建立任务依赖性,因为它是一个方法,而不是一个任务。因此,如果您在任务的 action 里面使用 copy()方法,必须显式声明所有的输入和输出以得到正确的行为。
使用有最新状态检查的 copy() 方法复制文件
build.gradle
task copyMethodWithExplicitDependencies{
inputs.file copyTask // up-to-date check for inputs, plus add copyTask as dependency
outputs.dir 'some-dir' // up-to-date check for outputs
doLast{
copy {
// Copy the output of copyTask
from copyTask
into 'some-dir'
}
}
}
在可能的情况下,最好是使用 Copy 任务,因为它支持增量构建和任务依赖关系推理,而不需要你额外付出。copy()方法可以作为一个任务执行的部分来复制文件。即,这个 copy() 方法旨在用于自定义任务中,需要文件复制作为其一部分功能的时候。在这种情况下,自定义任务应充分声明与复制操作有关的输入/输出。
重命名文件
重命名复制的文件
build.gradle
task rename(type: Copy) {
from 'src/main/webapp'
into 'build/explodedWar'
// Use a closure to map the file name
rename { String fileName ->
fileName.replace('-staging-', '')
}
// Use a regular expression to map the file name
rename '(.+)-staging-(.+)', '$1$2'
rename(/(.+)-staging-(.+)/, '$1$2')
}
过滤文件
过滤要复制的文件
build.gradle
import org.apache.tools.ant.filters.FixCrLfFilter
import org.apache.tools.ant.filters.ReplaceTokens
task filter(type: Copy) {
from 'src/main/webapp'
into 'build/explodedWar'
// Substitute property references in files
expand(copyright: '2009', version: '2.3.1')
expand(project.properties)
// Use some of the filters provided by Ant
filter(FixCrLfFilter)
filter(ReplaceTokens, tokens: [copyright: '2009', version: '2.3.1'])
// Use a closure to filter each line
filter { String line ->
"[$line]"
}
}
使用 CopySpec 类
复制规范用来组织一个层次结构。一个复制规范继承其目标路径,包含模式,排除模式,复制操作,名称映射和过滤器。
嵌套的复制规范
build.gradle
task nestedSpecs(type: Copy) {
into 'build/explodedWar'
exclude '**/*staging*'
from('src/dist') {
include '**/*.html'
}
into('libs') {
from configurations.runtime
}
}
使用 Sync 任务
Sync 任务继承了 Copy 任务。当它执行时,它会将源文件复制到目标目录中,然后从目标目录移除所有不是它复制的文件。这可以用来做一些事情,比如安装你的应用程序、 创建你的归档文件的 exploded 副本,或维护项目的依赖项的副本。
这里是一个例子,维护在 build/libs 目录中的项目运行时依赖的副本。
使用同步任务复制依赖项
build.gradle
task libs(type: Sync) {
from configurations.runtime
into "$buildDir/libs"
}
创建归档文件
一个项目可以有你所想要的一样多的 JAR 文件。您也可以将 WAR、 ZIP 和 TAG 文件添加到您的项目。使用各种归档任务可以创建以下的归档文件: Zip, Tar, Jar, War, and Ear. 他们的工作方式都一样,所以让我们看看如何创建一个 ZIP 文件。
创建一个 ZIP 文件
build.gradle
apply plugin: 'java'
task zip(type: Zip) {
from 'src/dist'
into('libs') {
from configurations.runtime
}
}
为什么要用 Java 插件?
Java 插件对归档任务添加了一些默认值。如果你愿意,使用归档任务时可以不需要 Java 插件。您需要提供一些值给附加的属性。
归档任务与 Copy 任务的工作方式一样,并且实现了相同的 CopySpec 接口。像使用 Copy 任务一样,你需要使用 from() 的方法指定输入的文件,并可以选择是否通过 into() 方法指定最终在存档中的位置。您可以通过一个复制规范来筛选文件的内容、 重命名文件和进行其他你可以做的事情。
归档命名
生成的归档的默认名称是 projectName-version.type。举个例子:
创建 ZIP 文件
build.gradle
apply plugin: 'java'
version = 1.0
task myZip(type: Zip) {
from 'somedir'
}
println myZip.archiveName
println relativePath(myZip.destinationDir)
println relativePath(myZip.archivePath)
gradle -q myZip 的输出结果
> gradle -q myZip
zipProject-1.0.zip
build/distributions
build/distributions/zipProject-1.0.zip
它添加了一个名称为 myZip 的ZIP归档任务,产生 ZIP 文件 zipProject 1.0.zip。区分归档任务的名称和归档任务生成的归档文件的名称是很重要的。归档的默认名称可以通过项目属性 archivesBaseName 来更改。还可以在以后的任何时候更改归档文件的名称。
这里有很多你可以在归档任务中设置的属性。它们在以下的表 16.1,"存档任务-命名属性"中列出。你可以,比方说,更改归档文件的名称:
配置归档任务-自定义归档名称
build.gradle
apply plugin: 'java'
version = 1.0
task myZip(type: Zip) {
from 'somedir'
baseName = 'customName'
}
println myZip.archiveName
gradle -q myZip 的输出结果
gradle -q myZip customName-1.0.zip
您可以进一步自定义存档名称:
配置归档任务 - appendix & classifier
build.gradle
apply plugin: 'java'
archivesBaseName = 'gradle'
version = 1.0
task myZip(type: Zip) {
appendix = 'wrapper'
classifier = 'src'
from 'somedir'
}
println myZip.archiveName
gradle -q myZip 的输出结果
> gradle -q myZip
gradle-wrapper-1.0-src.zip
表 16.1. 归档任务-命名属性
属性名称 | 类型 | 默认值 | 描述 |
archiveName
|
String
|
extension
如果这些属性中的任何一个为空,那后面的 |
生成的归档文件的基本文件名 |
archivePath
|
File
|
archiveName
|
生成的归档文件的绝对路径。 |
destinationDir
|
File
|
依赖于归档类型。JAR包和 WAR包会生成到 project.buildDir /libraries中。ZIP文件和
TAR文件会生成到project.buildDir /distributions中。 |
存放生成的归档文件的目录 |
baseName
|
String
|
project.name
|
归档文件的名称中的基本名称部分。 |
appendix
|
String
|
null
|
归档文件的名称中的附录部分。 |
version
|
String
|
project.version
|
归档文件的名称中的版本部分。 |
classifier
|
String
|
null
|
归档文件的名称中的分类部分。 |
extension
|
String
|
依赖于归档的类型,用于TAR文件,可以是以下压缩类型: tbz2 . |
归档文件的名称中的扩展名称部分。 |
共享多个归档之间的内容
你可以使用 Project.copySpec()方法在归档之间共享内容。
你经常会想要发布一个归档文件,这样就可从另一个项目中使用它。
标签:Gradle
相关阅读 >>
更多相关阅读请进入《Gradle》频道 >>