准备一个文件目录如下:点击下载

image.png

准确的Tree结构:

root
│  build.gradle
│  solution.gradle
│  
└──src
    ├──docs
    │      aa.aa
    │      install.md
    │      install.txt
    │      readme.txt
    │      
    └──web
        │  index.html
        │  
        └──images
                cat.jpg
                dog.jpg

任务

  1. 拷贝src/web目录到build/web目录,并且拷贝src/docs目录下的所有 txt 文件到build/web/help下。
  2. 打包build/web目录下除 images 文件夹外的所有文件为web.zip,并将web.zip放置于build目录下。
  3. 解压build/web.zipbuild/exploded
  4. 删除build/web/help

解决方案

//1.Copy
task copyWeb(type:Copy){
    from 'src/web'
    from ('src/docs'){
        include '*.txt'
        into 'help'
    }
    into 'build/web'
}
//2.Zip
task bundleWeb(type:Zip,dependsOn:copyWeb){
    baseName 'web'
    destinationDir file('build')

    from 'build/web'
    exclude 'images/**'
}
//3.UnZip
task unpackBundle(type:Copy,dependsOn:bundleWeb){
    from zipTree('build/web.zip')
    into 'build/exploded'
}
//4.Delete
task deleteHelp(type:Delete,dependsOn:copyWeb){
    delete 'build/web/help'
}

是的你没有看错,任务中的4个问题就用上面这20几行代码轻松解决;但是,你可能还是不太清楚这些这些配置的规则,它们看上去就像一堆键值对类似于Json,然而实际上它们都是由属性和方法构成的,就像Java一样:

属性描述类型excludes排除模式集合Setincludes包含模式集合SetbaseName文件的基本名称StringdestinationDir文件生成的目录File方法描述返回from(sourcePaths)指定副本的源文件或目录AbstractCopyTaskinclude(includes)指定包含模式AbstractCopyTaskexclude(excludes)指定排除模式AbstractCopyTaskinto(destDir)指定副本的目标目录AbstractCopyTask

所以上面解决方案的完整写法:

//1.Copy
task copyWeb(type:Copy){
    from('src/web')
    from('src/docs'){
        include('*.txt')
        into('help')
    }
    into('build/web')
}
//2.Zip
task bundleWeb(type:Zip,dependsOn:copyWeb){
    baseName='web'
    destinationDir=file('build')

    from('build/web')
    exclude('images/**')
}
//3.UnZip
task unpackBundle(type:Copy,dependsOn:bundleWeb){
    from(zipTree('build/web.zip'))
    into('build/exploded')
}
//4.Delete
task deleteHelp(type:Delete,dependsOn:copyWeb){
    delete('build/web/help')
}

这样看起来就清晰多了,以上脚本中用到的所有方法及属性都可以在 Gradle DSL Reference 文档中查到,该文档详尽的解释了每个方法及参数的作用,由于 Groovy 语言的特性,一般 Gradle 脚本都会使用简写的方式,也就是省略掉‘()’、‘=’等符号,因为省略掉这些符号不会影响到语法歧义,说到歧义大家可以看到 3.UnZip 中有一行代码 from(zipTree('build/web.zip')) 即使简写也只能写成 from zipTree('build/web.zip') 而非 from zipTree 'build/web.zip',因为最后这种写法显然使 Groovy 无法理解你要将 'build/web.zip' 作为 zipTree 的参数还是 from 的参数

其实在任何一种计算机语言中各种‘()’、‘[]’、‘{}’都是为了避免产生语法歧义,只要你掌握其中规则,知道怎么写才能避免歧义使代码正常运作,再了解其特有的语言特性如闭包lambda委托等,你就大致掌握了这门语言。现在再来看看 Groovy ,它其实就是一种不需要 public修饰符、类型说明、构造函数以及 ()的 Java简化版。