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