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