Gradle復(fù)制文件

2020-07-24 16:01 更新

你可以使用復(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.6.1 重命名文件

例 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.6.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@.

15.6.3 使用 CopySpec 類

復(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
    }
}


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)