W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
你可以使用復(fù)制任務(wù)( Copy )去復(fù)制文件. 復(fù)制任務(wù)擴展性很強,能夠過濾復(fù)制文件的內(nèi)容, 映射文件名.
使用復(fù)制任務(wù)時需要提供想要復(fù)制的源文件和一個目標(biāo)目錄,如果你要指定文件被復(fù)制時的轉(zhuǎn)換方式,可以使用 復(fù)制規(guī)則. 復(fù)制規(guī)則被 CopySpec 接口抽象,復(fù)制任務(wù)實現(xiàn)了這個接口. 使用 CopySpec.from() 方法指定源文件.使用 CopySpec.into() 方法指定目標(biāo)目錄.
例 15.10. 使用復(fù)制任務(wù)復(fù)制文件
build.gradle
task copyTask(type: Copy) {
from 'src/main/webapp'
into 'build/explodedWar'
}
from() 方法接收任何 files() 方法支持的參數(shù). 當(dāng)參數(shù)被解析為一個目錄時,在這個目錄下的任何文件都會被遞歸地復(fù)制到目標(biāo)目錄(但不是目錄本身).當(dāng)一個參數(shù)解析為一個文件時,該文件被復(fù)制到目標(biāo)目錄中.當(dāng)參數(shù)被解析為一個不存在的文件時,這個參數(shù)就會忽略.如果這個參數(shù)是一個任務(wù),任務(wù)的輸出文件(這個任務(wù)創(chuàng)建的文件)會被復(fù)制,然后這個任務(wù)會被自動添加為復(fù)制任務(wù)的依賴.
例 15.11 指定復(fù)制任務(wù)的源文件和目標(biāo)目錄
build.gradle
task anotherCopyTask(type: Copy) {
// 復(fù)制 src/main/webapp 目錄下的所有文件
from 'src/main/webapp'
// 復(fù)制一個單獨文件
from 'src/staging/index.html'
// 復(fù)制一個任務(wù)輸出的文件
from copyTask
// 顯式使用任務(wù)的 outputs 屬性復(fù)制任務(wù)的輸出文件
from copyTaskWithPatterns.outputs
// 復(fù)制一個 ZIP 壓縮文件的內(nèi)容
from zipTree('src/main/assets.zip')
// 最后指定目標(biāo)目錄
into { getDestDir() }
}
你可以使用Ant-style 規(guī)則或者一個閉合選擇要復(fù)制的文件.
例 15.12 選擇要復(fù)制文件
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() 方法復(fù)制文件,它的工作方式有一些限制,首先該方法不是增量的,請參考 第 14.9節(jié) 跳過最新的任務(wù).第二,當(dāng)一個任務(wù)被用作復(fù)制源時(例如 from() 方法的參數(shù)), copy() 方法不能夠?qū)崿F(xiàn)任務(wù)依賴,因為它是一個普通的方法不是一個任務(wù).因此,如果你使用 copy()方法作為一個任務(wù)的一部分功能,你需要顯式的聲明所有的輸入和輸出以確保獲得正確的結(jié)果.
例 15.13 不使用最新檢查方式下用 copy() 方法復(fù)制文件
build.gradle
task copyMethod << {
copy {
from 'src/main/webapp'
into 'build/explodedWar'
include '**/*.html'
include '**/*.jsp'
}
}
例 15.14 使用最新的檢查方式下用 copy() 方法復(fù)制文件
build.gradle
task copyMethodWithExplicitDependencies{
// 對輸入做最新檢查,添加 copyTask 作為依賴
inputs.file copyTask
outputs.dir 'some-dir' //對輸出做最新檢查
doLast{
copy {
// 復(fù)制 copyTask 的輸出
from copyTask
into 'some-dir'
}
}
}
建議盡可能的使用復(fù)制任務(wù),因為它支持增量化的構(gòu)建和任務(wù)依賴推理,而不需要去額外的費力處理這些.不過copy() 方法可以用作復(fù)制任務(wù)實現(xiàn)的一部分.即該 方法被在自定義復(fù)制任務(wù)中使用,請參考 第60章 編寫自定義任務(wù).在這樣的場景下,自定義任務(wù)應(yīng)該充分聲明與復(fù)制操作相關(guān)的輸入/輸出。
例 15.15 在復(fù)制時重命名文件
build.gradle
task rename(type: Copy) {
from 'src/main/webapp'
into 'build/explodedWar'
// 使用一個閉合映射文件名
rename { String fileName ->
fileName.replace('-staging-', '')
}
// 使用正則表達(dá)式映射文件名
rename '(.+)-staging-(.+)', '$1$2'
rename(/(.+)-staging-(.+)/, '$1$2')
}
例 15.16 在復(fù)制時過濾文件
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'
// 在文件中替代屬性標(biāo)記
expand(copyright: '2009', version: '2.3.1')
expand(project.properties)
// 使用 Ant 提供的過濾器
filter(FixCrLfFilter)
filter(ReplaceTokens, tokens: [copyright: '2009', version: '2.3.1'])
// 用一個閉合來過濾每一行
filter { String line ->
"[$line]"
}
// 使用閉合來刪除行
filter { String line ->
line.startsWith('-') ? null : line
}
}
在源文件中擴展和過濾操作都會查找的某個標(biāo)志 token,如果它的名字是 tokenName , 它的格式應(yīng)該類似于 @tokenName@.
復(fù)制規(guī)范來自于層次結(jié)構(gòu),一個復(fù)制規(guī)范繼承其目標(biāo)路徑,包括模式,排除模式,復(fù)制操作,名稱映射和過濾器.
例 15.17. 嵌套復(fù)制規(guī)范
build.gradle
task nestedSpecs(type: Copy) {
into 'build/explodedWar'
exclude '**/*staging*'
from('src/dist') {
include '**/*.html'
}
into('libs') {
from configurations.runtime
}
}
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: